diff dmd/backend/Symbol.d @ 0:10317f0c89a5

Initial commit
author korDen
date Sat, 24 Oct 2009 08:42:06 +0400
parents
children fd4acc376c45
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmd/backend/Symbol.d	Sat Oct 24 08:42:06 2009 +0400
@@ -0,0 +1,388 @@
+module dmd.backend.Symbol;
+
+import dmd.backend.dt_t;
+import dmd.backend.TYPE;
+import dmd.backend.LIST;
+import dmd.backend.block;
+import dmd.backend.func_t;
+import dmd.backend.enum_t;
+import dmd.backend.elem;
+import dmd.backend.struct_t;
+import dmd.backend.template_t;
+import dmd.backend.targ_types;
+import dmd.backend.vec_t;
+import dmd.backend.SYMIDX;
+import dmd.backend.regm_t;
+import dmd.backend.Util;
+
+struct Symbol
+{
+    ushort	id;
+
+    Symbol* Sl;
+	Symbol* Sr;		// left, right child
+
+    Symbol *Snext;		// next in threaded list
+
+    dt_t* Sdt;			// variables: initializer
+    type* Stype;		// type of Symbol
+
+    tym_t ty()
+	{
+		return Stype.Tty;
+	}
+
+    union			// variants for different Symbol types
+    {
+		enum_t* Senum;		// SCenum
+		struct
+		{    
+			func_t* Sfunc;	// tyfunc
+			list_t Spath1;	// SCfuncalias member functions: same as Spath
+					// and in same position
+					// SCadl: list of associated functions for ADL lookup
+		}
+		struct			// SClabel
+		{   
+			int Slabel;		// TRUE if label was defined
+			block* Slabelblk;	// label block
+		}
+///		#define Senumlist Senum->SEenumlist
+
+		struct			// SClinkage
+		{
+			int Slinkage;	// tym linkage bits
+			uint Smangle;
+		}
+
+		struct
+		{
+			char Sbit;		// SCfield: bit position of start of bit field
+			char Swidth;	// SCfield: width in bits of bit field
+			targ_size_t Smemoff; // SCmember,SCfield: offset from start of struct
+		}
+
+		elem* Svalue;		/* SFLvalue: value of const
+				   SFLdtorexp: for objects with destructor,
+				   conditional expression to precede dtor call
+				 */
+
+		struct_t* Sstruct;	// SCstruct
+		template_t* Stemplate;	// SCtemplate
+		Symbol* Simport;	// SCextern: if dllimport Symbol, this is the
+				// Symbol it was imported from
+
+		ubyte Spreg;	// SCfastpar: register parameter is passed in
+    }
+
+    Symbol* Sscope;		// enclosing scope (could be struct tag,
+				// enclosing inline function for statics,
+				// or namespace)
+///#define isclassmember(s)	((s)->Sscope && (s)->Sscope->Sclass == SCstruct)
+
+    const(char)* prettyIdent;	// the symbol identifer as the user sees it
+
+    enum_SC Sclass;		// storage class (SCxxxx)
+    char Sfl;			// flavor (FLxxxx)
+    SYMFLGS Sflags;		// flag bits (SFLxxxx)
+
+    vec_t	Srange;		// live range, if any
+    vec_t	Slvreg;		// when symbol is in register
+    targ_size_t Ssize;		// tyfunc: size of function
+    targ_size_t Soffset;	// variables: offset of Symbol in its storage class
+
+    SYMIDX Ssymnum;		// Symbol number (index into globsym.tab[])
+				// SCauto,SCparameter,SCtmp,SCregpar,SCregister
+
+    short Sseg;			// segment index
+
+    int Sweight;		// usage count, the higher the number,
+				// the more worthwhile it is to put in
+				// a register
+    union
+    {
+		uint Sxtrnnum;	// SCcomdef,SCextern,SCcomdat: external symbol # (starting from 1)
+		uint Stypidx;	// SCstruct,SCunion,SCclass,SCenum,SCtypedef: debug info type index
+
+		struct
+		{ 
+			ubyte Sreglsw;
+			ubyte Sregmsw;
+			regm_t Sregm;	// mask of registers
+		}
+    }
+
+    regm_t	Sregsaved;	// mask of registers not affected by this func
+
+    char Sident[35];	// identifier string (dynamic array)
+				// (the size is for static Symbols)
+
+    bool needThis()	// true if symbol needs a 'this' pointer
+	{
+		assert(false);
+	}
+}
+
+void dumpSymbol(Symbol* foo)
+{
+	foreach (a, b; foo.tupleof)
+	{
+		static if (typeof(foo.tupleof[a]).stringof != "char[35u]") {
+			std.stdio.writeln(foo.tupleof[a].stringof, " ", cast(char*)&foo.tupleof[a] - cast(char*)foo, " = ", cast(int)foo.tupleof[a]);
+			//std.stdio.writeln("printf(\"", foo.tupleof[a].stringof, " %d = %d\\n\",(char*)(&", foo.tupleof[a].stringof, ")-(char*)foo, ", foo.tupleof[a].stringof, ");");
+		}
+	}
+	
+	std.stdio.writefln("(*foo).Sclass %d = %d", (cast(char*)&foo.Sclass - cast(char*)foo), cast(int)foo.Sclass);
+	//std.stdio.writeln("printf(\"(*foo).Sclass %d %d\\n\", ((char*)&foo->Sclass - (char*)foo), (int)foo->Sclass);");
+}
+
+/+
+struct Symbol
+{
+debug {
+    ushort	id;
+///#define IDsymbol 0x5678
+///#define symbol_debug(s) assert((s)->id == IDsymbol)
+///#define class_debug(s) assert((s)->id == IDsymbol)
+} else {
+///#define symbol_debug(s)
+///#define class_debug(s)
+}
+
+    Symbol* Sl;
+	Symbol* Sr;		// left, right child
+
+version (TX86) {
+    Symbol *Snext;		// next in threaded list
+}
+    dt_t* Sdt;			// variables: initializer
+    type* Stype;		// type of Symbol
+
+	auto ty() {
+		assert(false);
+		//return Stype.Tty;
+	}
+
+	auto Senumlist()
+	{
+		return Senum.SEenumlist;
+	}
+
+    union			// variants for different Symbol types
+    {
+		enum_t* Senum;		// SCenum
+		struct
+		{   
+			func_t* Sfunc;	// tyfunc
+			list_t Spath1;	// SCfuncalias member functions: same as Spath
+					// and in same position
+					// SCadl: list of associated functions for ADL lookup
+		}
+		struct			// SClabel
+		{   
+			int Slabel;		// TRUE if label was defined
+			block* Slabelblk_;	// label block
+		}
+
+version (TX86) {
+		struct			// SClinkage
+		{
+			long Slinkage;	// tym linkage bits
+			uint Smangle;
+		}
+} else {
+		long Slinkage;		// SClinkage, tym linkage bits
+}
+
+		struct
+		{
+			char Sbit;		// SCfield: bit position of start of bit field
+			char Swidth;	// SCfield: width in bits of bit field
+version (TX86) {
+			targ_size_t Smemoff; // SCmember,SCfield: offset from start of struct
+}
+		}
+
+		elem* Svalue;		/* 	SFLvalue: value of const
+								SFLdtorexp: for objects with destructor,
+								conditional expression to precede dtor call
+							*/
+		struct_t* Sstruct;	// SCstruct
+
+		template_t* Stemplate;	// SCtemplate
+
+version (SCPP) {
+		struct			// SCnamespace
+		{   
+			Symbol* Snameroot;	// the Symbol table for the namespace
+			list_t Susing;	// other namespaces from using-directives
+		}
+		struct
+		{
+			Symbol* Smemalias;	// SCalias: pointer to Symbol to use instead
+					// (generated by using-declarations and
+					// namespace-alias-definitions)
+					// SCmemalias: pointer to member of base class
+					// to use instead (using-declarations)
+			symlist_t Spath;	// SCmemalias: path of classes to get to base
+					// class of which Salias is a member
+		}
+}
+	
+version (TX86) {
+		Symbol* Simport;	// SCextern: if dllimport Symbol, this is the
+					// Symbol it was imported from
+}
+		ubyte Spreg;	// SCfastpar: register parameter is passed in
+    }
+
+version (SCPP_OR_MARS) {
+    Symbol* Sscope;		// enclosing scope (could be struct tag,
+				// enclosing inline function for statics,
+				// or namespace)
+	//#define isclassmember(s)	((s)->Sscope && (s)->Sscope->Sclass == SCstruct)
+}
+
+version (SCPP) {
+    Symbol* Scover;		// if there is a tag name and a regular name
+				// of the same identifier, Scover is the tag
+				// Scover can be SCstruct, SCenum, SCtemplate
+				// or an SCalias to them.
+	//#define isscover(s)		((s)->Sclass == SCstruct || (s)->Sclass == SCenum || (s)->Sclass == SCtemplate)
+    uint Ssequence;		// sequence number (used for 2 level lookup)
+				// also used as 'parameter number' for SCTtemparg
+} else version (MARS) {
+    const(char)* prettyIdent;	// the symbol identifer as the user sees it
+} else version (AUTONEST) {
+    ubyte Spush;	// # of pushes followed by # of
+    ubyte Spop;		// pops of scope level
+}
+
+version (ELFOBJ_OR_MACHOBJ) {
+    int         obj_si;       // Symbol index of coff or elf symbol
+    uint 		dwarf_off;    // offset into .debug section
+    targ_size_t code_off;	// rel. offset from start of block where var is initialized
+    targ_size_t last_off;	// last offset using var
+}
+
+version (TARGET_OSX) {
+    targ_size_t Slocalgotoffset;
+}
+
+    SC Sclass;		// storage class (SCxxxx)
+    char Sfl;			// flavor (FLxxxx)
+    SYMFLGS Sflags;		// flag bits (SFLxxxx)
+///	#define SFLmark		0x08	// temporary marker
+///	#define SFLvalue	0x01	// Svalue contains const expression
+///	#define SFLimplem	0x02	// if seen implementation of Symbol
+					// (function body for functions,
+					// initializer for variables)
+///	#define SFLdouble	0x02	// SCregpar or SCparameter, where float
+					// is really passed as a double
+///	#define SFLfree		0x04	// if we can symbol_free() a Symbol in
+					// a Symbol table[]
+///	#define SFLexit		0x10	// tyfunc: function does not return
+					// (ex: exit,abort,_assert,longjmp)
+///	#define SFLtrue		0x200	// value of Symbol != 0
+///	#define SFLreplace	SFLmark	// variable gets replaced in inline expansion
+///	#define SFLskipinit	0x10000	// SCfield, SCmember: initializer is skipped
+///	#define SFLnodebug	0x20000	// don't generate debug info
+///	#define SFLwasstatic	0x800000 // was an uninitialized static
+///	#define SFLweak		0x1000000 // resolve to NULL if not found
+
+	// CPP
+///	#define SFLnodtor	0x10	// set if destructor for Symbol is already called
+///	#define SFLdtorexp	0x80	// Svalue has expression to tack onto dtor
+///	#define SFLmutable	0x100000	// SCmember or SCfield is mutable
+///	#define SFLdyninit	0x200000	// symbol has dynamic initializer
+///	#define SFLtmp		0x400000	// symbol is a generated temporary
+version (XXX) { ///TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS
+    	///#define SFLthunk	0x40000 // symbol is temporary for thunk
+}
+
+	// Possible values for protection bits
+///	#define SFLprivate	0x60
+///	#define SFLprotected	0x40
+///	#define SFLpublic	0x20
+///	#define SFLnone		0x00
+///	#define SFLpmask	0x60	// mask for the protection bits
+version (VEC_VTBL_LIST) {
+///	#define SFLvtbl		0x2000	// Symbol is a vtable or vbtable
+}
+
+	// OPTIMIZER and CODGEN
+///	#define	GTregcand	0x100	// if Symbol is a register candidate
+///	#define	SFLdead		0x800	// this variable is dead
+
+	// OPTIMIZER only
+///	#define	SFLunambig	0x400	// only accessible by unambiguous reference,
+					// i.e. cannot be addressed via pointer
+					// (GTregcand is a subset of this)
+					// P.S. code generator turns off this
+					// flag if any reads are done from it.
+					// This is to eliminate stores to it
+					// that are never read.
+///	#define	SFLlivexit	0x1000	// live on exit from function
+///	#define	SFLnotbasiciv	0x4000	// not a basic induction variable
+///	#define SFLnord		SFLdouble // SCauto,SCregister,SCtmp: disallow redundant warnings
+
+	// CODGEN only
+///	#define GTtried	  	SFLmark	// tried to place in register
+///	#define GTbyte	  	0x8000	// variable is sometimes accessed as
+///	#define SFLread		0x40000	// variable is actually read from
+					// (to eliminate dead stores)
+///	#define SFLspill	0x80000	// only in register part of the time
+
+    vec_t	Srange;		// live range, if any
+    vec_t	Slvreg;		// when symbol is in register
+    targ_size_t Ssize;		// tyfunc: size of function
+    targ_size_t Soffset;	// variables: offset of Symbol in its storage class
+version (TARGET_MAC) {
+///#define Smemoff Soffset
+}
+
+    // CPP || OPTIMIZER
+    SYMIDX Ssymnum;		// Symbol number (index into globsym.tab[])
+				// SCauto,SCparameter,SCtmp,SCregpar,SCregister
+    // CODGEN
+version (TX86) {
+    short Sseg;			// segment index
+}
+    int Sweight;		// usage count, the higher the number,
+				// the more worthwhile it is to put in
+				// a register
+    union
+    {
+		uint Sxtrnnum;	// SCcomdef,SCextern,SCcomdat: external symbol # (starting from 1)
+		uint Stypidx;	// SCstruct,SCunion,SCclass,SCenum,SCtypedef: debug info type index
+		struct
+		{
+			ubyte Sreglsw;
+			ubyte Sregmsw;
+			regm_t Sregm;	// mask of registers
+		}			// SCregister,SCregpar,SCpseudo: register number
+    }
+
+version (TX86) {
+    regm_t	Sregsaved;	// mask of registers not affected by this func
+}
+
+version (SOURCE_4SYMS) {
+    Srcpos Ssrcpos;		// file position for definition
+}
+    // Target Additions
+///    TARGET_structSYMBOL
+version (TX86) {
+    char Sident[SYM_PREDEF_SZ];	// identifier string (dynamic array)
+				// (the size is for static Symbols)
+} else {
+    long[0] Sident;	// identifier string (dynamic array) as a str4
+}
+
+    bool needThis()	// true if symbol needs a 'this' pointer
+	{
+		assert(false);
+	}
+}
++/
\ No newline at end of file