cvsuser 03/12/04 22:33:17
Modified: imcc symreg.h symreg.c
Log:
Add a few better named wrappers to _mk_address
Revision Changes Path
1.38 +15 -2 parrot/imcc/symreg.h
Index: symreg.h
===================================================================
RCS file: /cvs/public/parrot/imcc/symreg.h,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -w -r1.37 -r1.38
--- symreg.h 24 Nov 2003 06:03:23 -0000 1.37
+++ symreg.h 5 Dec 2003 06:33:16 -0000 1.38
@@ -45,7 +45,10 @@
enum USAGE {
U_KEYED = 1 << 0, /* array, hash, keyed */
U_NEW = 1 << 1, /* PMC was inited */
- U_SPILL = 1 << 2 /* reg is spilled */
+ U_SPILL = 1 << 2, /* reg is spilled */
+ U_GLOBAL = 1 << 3, /* symbol is global (fixup) */
+ U_LEXICAL = 1 << 4, /* symbol is lexical */
+ U_FIXUP = 1 << 5 /* maybe not global, force fixup */
};
typedef struct _SymReg {
@@ -88,6 +91,10 @@
};
EXTERN Namespace * namespace;
+
+struct _IMC_Unit;
+
+
/* functions */
SymReg * mk_symreg(char *, int t);
@@ -95,9 +102,16 @@
SymReg * mk_ident(char *, int t);
SymReg * mk_const(char *, int t);
SymReg * mk_const_ident(char *, int t, SymReg *, int);
+
+/* Eventually make mk_address static */
SymReg * mk_address(char *, int uniq);
+/* Expose API through these */
SymReg * mk_sub_label(char *);
+SymReg * mk_sub_address(char *);
+SymReg * mk_local_label(struct _IMC_Unit *, char *);
+SymReg * mk_label_address(struct _IMC_Unit *, char *);
SymReg * mk_pcc_sub(char *, int proto);
+
char * symreg_to_str(SymReg *);
void add_pcc_arg(SymReg *r, SymReg * arg);
void add_pcc_sub(SymReg *r, SymReg * arg);
@@ -128,7 +142,6 @@
U_add_all };
SymReg * mk_pasm_reg(char *);
-struct _IMC_Unit;
void free_sym(SymReg *r);
void store_symreg(SymReg * r);
1.43 +34 -3 parrot/imcc/symreg.c
Index: symreg.c
===================================================================
RCS file: /cvs/public/parrot/imcc/symreg.c,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -w -r1.42 -r1.43
--- symreg.c 24 Nov 2003 06:03:23 -0000 1.42
+++ symreg.c 5 Dec 2003 06:33:16 -0000 1.43
@@ -332,21 +332,52 @@
return r;
}
-
SymReg * mk_address(char * name, int uniq)
{
+ SymReg * s;
SymReg ** h = *name == '_' ? ghash : cur_unit->hash;
- return _mk_address(h, name, uniq);
+ s = _mk_address(h, name, uniq);
+ if(*name == '_')
+ s->usage |= U_FIXUP;
+ return s;
}
/*
* Make and store a new address label for a sub.
+ * Label gets a fixup entry.
*/
SymReg * mk_sub_label(char * name)
{
- return _mk_address(ghash, name, U_add_uniq_sub);
+ SymReg * s = _mk_address(ghash, name, U_add_uniq_sub);
+ s->usage |= U_FIXUP;
+ return s;
+}
+
+/*
+ * Make a symbol for a label, symbol gets a fixup entry.
+ */
+SymReg * mk_sub_address(char * name)
+{
+ SymReg * s = _mk_address(ghash, name, U_add_once);
+ s->usage |= U_FIXUP;
+ return s;
}
+/*
+ * Make a local symbol, no fixup entry.
+ */
+SymReg * mk_local_label(IMC_Unit * unit, char * name)
+{
+ return _mk_address(unit->hash, name, U_add_uniq_label);
+}
+
+/*
+ *
+ */
+SymReg * mk_label_address(IMC_Unit * unit, char * name)
+{
+ return _mk_address(unit->hash, name, U_add_once);
+}
/* link keys to a keys structure = SymReg