diff options
author | Stan Shebs <shebs@codesourcery.com> | 1999-04-16 01:35:26 +0000 |
---|---|---|
committer | Stan Shebs <shebs@codesourcery.com> | 1999-04-16 01:35:26 +0000 |
commit | c906108c21474dfb4ed285bcc0ac6fe02cd400cc (patch) | |
tree | a0015aa5cedc19ccbab307251353a41722a3ae13 /gdb/scm-tags.h | |
parent | cd946cff9ede3f30935803403f06f6ed30cad136 (diff) | |
download | gdb-c906108c21474dfb4ed285bcc0ac6fe02cd400cc.zip gdb-c906108c21474dfb4ed285bcc0ac6fe02cd400cc.tar.gz gdb-c906108c21474dfb4ed285bcc0ac6fe02cd400cc.tar.bz2 |
Initial creation of sourceware repositorygdb-4_18-branchpoint
Diffstat (limited to 'gdb/scm-tags.h')
-rw-r--r-- | gdb/scm-tags.h | 385 |
1 files changed, 385 insertions, 0 deletions
diff --git a/gdb/scm-tags.h b/gdb/scm-tags.h new file mode 100644 index 0000000..fbe45cc --- /dev/null +++ b/gdb/scm-tags.h @@ -0,0 +1,385 @@ +/* This is a minimally edited version of Guile's tags.h. */ +/* classes: h_files */ + +#ifndef TAGSH +#define TAGSH +/* Copyright (C) 1995 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, the Free Software Foundation gives permission + * for additional uses of the text contained in its release of GUILE. + * + * The exception is that, if you link the GUILE library with other files + * to produce an executable, this does not by itself cause the + * resulting executable to be covered by the GNU General Public License. + * Your use of that executable is in no way restricted on account of + * linking the GUILE library code into it. + * + * This exception does not however invalidate any other reasons why + * the executable file might be covered by the GNU General Public License. + * + * This exception applies only to the code released by the + * Free Software Foundation under the name GUILE. If you copy + * code from other Free Software Foundation releases into a copy of + * GUILE, as the General Public License permits, the exception does + * not apply to the code that you add in this way. To avoid misleading + * anyone as to the status of such modified files, you must delete + * this exception notice from them. + * + * If you write modifications of your own for GUILE, it is your choice + * whether to permit this exception to apply to your modifications. + * If you do not wish that, delete this exception notice. + */ + + +/** This file defines the format of SCM values and cons pairs. + ** It is here that tag bits are assigned for various purposes. + **/ + + +/* Three Bit Tags + * + * 000 -- a non-immediate value. Points into the pair heap. + * + * 001 -- a gloc (i.e., a resolved global variable in a CAR in a code graph) + * or the CAR of an object handle (i.e., the tagged pointer to the + * vtable part of a user-defined object). + * + * If X has this tag, the value at CDAR(X - 1) distinguishes + * glocs from object handles. The distinction only needs + * to be made in a few places. Only a few parts of the code know + * about glocs. In most cases, when a value in the CAR of a pair + * has the tag 001, it means that the pair is an object handle. + * + * 010 -- the tag for immediate, exact integers. + * + * 011 -- in the CAR of a pair, this tag indicates that the pair is a closure. + * The remaining bits of the CAR are a pointer into the pair heap + * to the code graph for the closure. + * + * 1xy -- an extension tag which means that there is a five or six bit + * tag to the left of the low three bits. See the nice diagrams + * in ../doc/code.doc if you want to know what the bits mean. + */ + + + + + +#define scm_tc3_cons 0 +#define scm_tc3_cons_gloc 1 +#define scm_tc3_closure 3 + +#define scm_tc7_ssymbol 5 +#define scm_tc7_msymbol 7 +#define scm_tc7_string 13 +#define scm_tc7_bvect 15 +#define scm_tc7_vector 21 +#define scm_tc7_lvector 23 +#define scm_tc7_ivect 29 +#define scm_tc7_uvect 31 +/* spare 37 39 */ +#define scm_tc7_fvect 45 +#define scm_tc7_dvect 47 +#define scm_tc7_cvect 53 +#define scm_tc7_port 55 +#define scm_tc7_contin 61 +#define scm_tc7_cclo 63 +/* spare 69 71 77 79 */ +#define scm_tc7_subr_0 85 +#define scm_tc7_subr_1 87 +#define scm_tc7_cxr 93 +#define scm_tc7_subr_3 95 +#define scm_tc7_subr_2 101 +#define scm_tc7_asubr 103 +#define scm_tc7_subr_1o 109 +#define scm_tc7_subr_2o 111 +#define scm_tc7_lsubr_2 117 +#define scm_tc7_lsubr 119 +#define scm_tc7_rpsubr 125 + +#define scm_tc7_smob 127 +#define scm_tc_free_cell 127 + +#define scm_tc16_flo 0x017f +#define scm_tc_flo 0x017fL + +#define SCM_REAL_PART (1L<<16) +#define SCM_IMAG_PART (2L<<16) +#define scm_tc_dblr (scm_tc16_flo|REAL_PART) +#define scm_tc_dblc (scm_tc16_flo|REAL_PART|IMAG_PART) + +#define scm_tc16_bigpos 0x027f +#define scm_tc16_bigneg 0x037f + +#define scm_tc16_fport (scm_tc7_port + 0*256L) +#define scm_tc16_pipe (scm_tc7_port + 1*256L) +#define scm_tc16_strport (scm_tc7_port + 2*256L) +#define scm_tc16_sfport (scm_tc7_port + 3*256L) + + + +/* For cons pairs with immediate values in the CAR */ +#define scm_tcs_cons_imcar 2:case 4:case 6:case 10:\ + case 12:case 14:case 18:case 20:\ + case 22:case 26:case 28:case 30:\ + case 34:case 36:case 38:case 42:\ + case 44:case 46:case 50:case 52:\ + case 54:case 58:case 60:case 62:\ + case 66:case 68:case 70:case 74:\ + case 76:case 78:case 82:case 84:\ + case 86:case 90:case 92:case 94:\ + case 98:case 100:case 102:case 106:\ + case 108:case 110:case 114:case 116:\ + case 118:case 122:case 124:case 126 + +/* For cons pairs with non-immediate values in the CAR */ +#define scm_tcs_cons_nimcar 0:case 8:case 16:case 24:\ + case 32:case 40:case 48:case 56:\ + case 64:case 72:case 80:case 88:\ + case 96:case 104:case 112:case 120 + +/* A CONS_GLOC occurs in code. It's CAR is a pointer to the + * CDR of a variable. The low order bits of the CAR are 001. + * The CDR of the gloc is the code continuation. + */ +#define scm_tcs_cons_gloc 1:case 9:case 17:case 25:\ + case 33:case 41:case 49:case 57:\ + case 65:case 73:case 81:case 89:\ + case 97:case 105:case 113:case 121 + +#define scm_tcs_closures 3:case 11:case 19:case 27:\ + case 35:case 43:case 51:case 59:\ + case 67:case 75:case 83:case 91:\ + case 99:case 107:case 115:case 123 + +#define scm_tcs_subrs scm_tc7_asubr:case scm_tc7_subr_0:case scm_tc7_subr_1:case scm_tc7_cxr:\ + case scm_tc7_subr_3:case scm_tc7_subr_2:case scm_tc7_rpsubr:case scm_tc7_subr_1o:\ + case scm_tc7_subr_2o:case scm_tc7_lsubr_2:case scm_tc7_lsubr + +#define scm_tcs_symbols scm_tc7_ssymbol:case scm_tc7_msymbol + +#define scm_tcs_bignums tc16_bigpos:case tc16_bigneg + + + +/* References to objects are of type SCM. Values may be non-immediate + * (pointers) or immediate (encoded, immutable, scalar values that fit + * in an SCM variable). + */ + +typedef long SCM; + +/* Cray machines have pointers that are incremented once for each word, + * rather than each byte, the 3 most significant bits encode the byte + * within the word. The following macros deal with this by storing the + * native Cray pointers like the ones that looks like scm expects. This + * is done for any pointers that might appear in the car of a scm_cell, pointers + * to scm_vector elts, functions, &c are not munged. + */ +#ifdef _UNICOS +# define SCM2PTR(x) ((int)(x) >> 3) +# define PTR2SCM(x) (((SCM)(x)) << 3) +# define SCM_POINTERS_MUNGED +#else +# define SCM2PTR(x) (x) +# define PTR2SCM(x) ((SCM)(x)) +#endif /* def _UNICOS */ + + + +/* Immediate? Predicates + */ +#define SCM_IMP(x) (6 & (int)(x)) +#define SCM_NIMP(x) (!SCM_IMP(x)) + + + +enum scm_tags +{ + scm_tc8_char = 0xf4 +}; + +#define SCM_ITAG8(X) ((int)(X) & 0xff) +#define SCM_MAKE_ITAG8(X, TAG) (((X)<<8) + TAG) +#define SCM_ITAG8_DATA(X) ((X)>>8) + + + +/* Local Environment Structure + */ +#define SCM_ILOCP(n) ((0xff & (int)(n))==0xfc) +#define SCM_ILOC00 (0x000000fcL) +#define SCM_IDINC (0x00100000L) +#define SCM_ICDR (0x00080000L) +#define SCM_IFRINC (0x00000100L) +#define SCM_IDSTMSK (-SCM_IDINC) +#define SCM_IFRAME(n) ((int)((SCM_ICDR-SCM_IFRINC)>>8) & ((int)(n)>>8)) +#define SCM_IDIST(n) (((unsigned long)(n))>>20) +#define SCM_ICDRP(n) (SCM_ICDR & (n)) + + +/* Immediate Symbols, Special Symbols, Flags (various constants). + */ + +/* ISYMP tests for ISPCSYM and ISYM */ +#define SCM_ISYMP(n) ((0x187 & (int)(n))==4) + +/* IFLAGP tests for ISPCSYM, ISYM and IFLAG */ +#define SCM_IFLAGP(n) ((0x87 & (int)(n))==4) +#define SCM_ISYMNUM(n) ((int)((n)>>9)) +#define SCM_ISYMCHARS(n) (scm_isymnames[SCM_ISYMNUM(n)]) +#define SCM_MAKSPCSYM(n) (((n)<<9)+((n)<<3)+4L) +#define SCM_MAKISYM(n) (((n)<<9)+0x74L) +#define SCM_MAKIFLAG(n) (((n)<<9)+0x174L) + +/* This table must agree with the declarations + * in repl.c: {Names of immediate symbols}. + * + * These are used only in eval but their values + * have to be allocated here. + * + */ + +#define SCM_IM_AND SCM_MAKSPCSYM(0) +#define SCM_IM_BEGIN SCM_MAKSPCSYM(1) +#define SCM_IM_CASE SCM_MAKSPCSYM(2) +#define SCM_IM_COND SCM_MAKSPCSYM(3) +#define SCM_IM_DO SCM_MAKSPCSYM(4) +#define SCM_IM_IF SCM_MAKSPCSYM(5) +#define SCM_IM_LAMBDA SCM_MAKSPCSYM(6) +#define SCM_IM_LET SCM_MAKSPCSYM(7) +#define SCM_IM_LETSTAR SCM_MAKSPCSYM(8) +#define SCM_IM_LETREC SCM_MAKSPCSYM(9) +#define SCM_IM_OR SCM_MAKSPCSYM(10) +#define SCM_IM_QUOTE SCM_MAKSPCSYM(11) +#define SCM_IM_SET SCM_MAKSPCSYM(12) +#define SCM_IM_DEFINE SCM_MAKSPCSYM(13) +#define SCM_IM_APPLY SCM_MAKISYM(14) +#define SCM_IM_CONT SCM_MAKISYM(15) +#define SCM_NUM_ISYMS 16 + +/* Important immediates + */ + +#define SCM_BOOL_F SCM_MAKIFLAG(SCM_NUM_ISYMS+0) +#define SCM_BOOL_T SCM_MAKIFLAG(SCM_NUM_ISYMS+1) +#define SCM_UNDEFINED SCM_MAKIFLAG(SCM_NUM_ISYMS+2) +#define SCM_EOF_VAL SCM_MAKIFLAG(SCM_NUM_ISYMS+3) + +#ifdef SICP +#define SCM_EOL SCM_BOOL_F +#else +#define SCM_EOL SCM_MAKIFLAG(SCM_NUM_ISYMS+4) +#endif + +#define SCM_UNSPECIFIED SCM_MAKIFLAG(SCM_NUM_ISYMS+5) + + + +/* Heap Pairs and the Empty List Predicates + */ +#define SCM_NULLP(x) (SCM_EOL == (x)) +#define SCM_NNULLP(x) (SCM_EOL != (x)) +#define SCM_CELLP(x) (!SCM_NCELLP(x)) +#define SCM_NCELLP(x) ((sizeof(scm_cell)-1) & (int)(x)) + + + +#define SCM_UNBNDP(x) (SCM_UNDEFINED==(x)) + + + +/* Testing and Changing GC Marks in Various Standard Positions + */ +#define SCM_GCMARKP(x) (1 & (int)SCM_CDR(x)) +#define SCM_GC8MARKP(x) (0x80 & (int)SCM_CAR(x)) +#define SCM_SETGCMARK(x) (SCM_CDR(x) |= 1) +#define SCM_CLRGCMARK(x) (SCM_CDR(x) &= ~1L) +#define SCM_SETGC8MARK(x) (SCM_CAR(x) |= 0x80) +#define SCM_CLRGC8MARK(x) (SCM_CAR(x) &= ~0x80L) + + +/* Extracting Tag Bits, With or Without GC Safety and Optional Bits + */ +#define SCM_TYP3(x) (7 & (int)SCM_CAR(x)) +#define SCM_TYP7(x) (0x7f & (int)SCM_CAR(x)) +#define SCM_TYP7S(x) (0x7d & (int)SCM_CAR(x)) +#define SCM_TYP16(x) (0xffff & (int)SCM_CAR(x)) +#define SCM_TYP16S(x) (0xfeff & (int)SCM_CAR(x)) +#define SCM_GCTYP16(x) (0xff7f & (int)SCM_CAR(x)) + + +/* Two slightly extensible types: smobs and ptobs. + * + */ +#define SCM_SMOBNUM(x) (0x0ff & (CAR(x)>>8)); +#define SCM_PTOBNUM(x) (0x0ff & (CAR(x)>>8)); + + + + +#define SCM_DIRP(x) (SCM_NIMP(x) && (TYP16(x)==(scm_tc16_dir))) +#define SCM_OPDIRP(x) (SCM_NIMP(x) && (CAR(x)==(scm_tc16_dir | OPN))) + + + +/* Lvectors + */ +#define SCM_LVECTORP(x) (TYP7(x)==tc7_lvector) + + +#if 0 + +/* Sockets + */ +#define tc_socket (tc7_port | OPN) +#define SCM_SOCKP(x) (((0x7f | OPN | RDNG | WRTNG) & CAR(x))==(tc_socket)) +#define SCM_SOCKTYP(x) (CAR(x)>>24) + + + +extern int scm_tc16_key_vector; +#define SCM_KEYVECP(X) (scm_tc16_key_vector == TYP16 (X)) +#define SCM_KEYVECLEN(OBJ) (((unsigned long)CAR (obj)) >> 16) + + +#define SCM_MALLOCDATA(obj) ((char *)CDR(obj)) +#define SCM_MALLOCLEN(obj) (((unsigned long)CAR (obj)) >> 16) +#define SCM_WORDDATA(obj) (CDR (obj)) + + +#define SCM_BYTECODEP(X) ((TYP7 (X) == tc7_cclo) && (CCLO_SUBR (X) == rb_proc)) +#define SCM_BYTECODE_CONSTANTS(X) (VELTS(X)[1]) +#define SCM_BYTECODE_CODE(X) (VELTS(X)[2]) +#define SCM_BYTECODE_NAME(X) (VELTS(X)[3]) +#define SCM_BYTECODE_BCODE(X) (VELTS(X)[4]) +#define SCM_BYTECODE_ELTS 5 + + +#define SCM_FREEP(x) (CAR(x)==tc_free_cell) +#define SCM_NFREEP(x) (!FREEP(x)) + +#endif /* 0*/ + +#ifdef __STDC__ + +#else /* STDC */ + +#endif /* STDC */ + + +#endif /* TAGSH */ |