bool ParmsToBeReversed( int flags, aux_info *inf ) { #ifdef REVERSE inf = LangInfo( flags, inf ); if( inf != NULL ) { if( inf->cclass & REVERSE_PARMS ) { return( TRUE ); } } #else flags = flags; inf = inf; #endif return( FALSE ); }
int ParmsToBeReversed( int flags, struct aux_info *inf ) { #ifdef REVERSE inf = LangInfo( flags, inf ); if( inf != NULL ) { if( inf->cclass & REVERSE_PARMS ) { return( 1 ); } } #else flags = flags; inf = inf; #endif return( 0 ); }
/* // Return name pattern manipulator string */ static const char *GetNamePattern( SYM_HANDLE sym_handle ) { char *pattern; SYM_ENTRY sym; aux_info *inf; inf = FindInfo( &sym, sym_handle ); #ifdef __SEH__ if(( sym_handle == SymTryInit ) || ( sym_handle == SymTryFini ) || ( sym_handle == SymTryUnwind ) || ( sym_handle == SymExcept )) { pattern = "*"; } else { #endif inf = LangInfo( sym.mods, inf ); if( sym.flags & SYM_FUNCTION ) { pattern = inf->objname; #if ( _CPU == 386 ) || ( _CPU == 8086 ) if( VarFunc( &sym ) ) { if( inf == &DefaultInfo ) inf = DftCallConv; if( inf == &StdcallInfo ) { pattern = CdeclInfo.objname; } else if( inf == &FastcallInfo ) { pattern = CdeclInfo.objname; } } #endif if( pattern == NULL ) { pattern = TS_CODE_MANGLE; } } else { pattern = VarNamePattern( inf ); if( pattern == NULL ) { pattern = TS_DATA_MANGLE; } } #ifdef __SEH__ } // close that else #endif return( pattern ); }
void InputManager::_load(xml::xmlNodePtr _node, const std::string & _file) { xml::xmlNodeIterator lang = _node->getNodeIterator(); while (lang.nextNode(XML_TYPE)) { std::string name; if ( false == lang->findAttribute("name", name)) continue; std::vector<std::string> chars = utility::split(lang->getBody()); if (chars.size() == INPUT_COUNT_LOAD_CHAR) { // сначала проверяем есть ли такой язык уже MapLang::iterator iter = mMapLanguages.find(name); MYGUI_ASSERT(iter == mMapLanguages.end(), "language '" << name << "' already exist"); // создаем язык mMapLanguages[name] = LangInfo(); iter = mMapLanguages.find(name); iter->second.resize(INPUT_COUNT_LOAD_CHAR); LangInfo & lang = iter->second; // и заполняем его for (size_t j=0; j<INPUT_COUNT_LOAD_CHAR; j++) { unsigned int ch = utility::parseUInt(chars[j]); if (INPUT_CHARSET_LIMIT < ch) { lang[j] = 0; MYGUI_LOG(Warning, "character with code '" << ch << "' out of range"); } else lang[j] = (Char)ch; } } else { MYGUI_LOG(Warning, "Quantity of characters is not " << INPUT_COUNT_LOAD_CHAR); } }; // обязательно обновляем итератор, так как не гарантируеться его сохранение mCurrentLanguage = mMapLanguages.find(INPUT_DEFAULT_LANGUAGE); }
void InputManager::createDefaultCharSet() { // вставляем английский язык mMapLanguages[INPUT_DEFAULT_LANGUAGE] = LangInfo(); mCurrentLanguage = mMapLanguages.find(INPUT_DEFAULT_LANGUAGE); mCurrentLanguage->second.resize(INPUT_COUNT_LOAD_CHAR); // временный массив Char chars[INPUT_COUNT_LOAD_CHAR] = { 0, 0, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 45, 61, 0, 0, 113, 119, 101, 114, 116, 121, 117, 105, 111, 112, 91, 93, 0, 0, 97, 115, 100, 102, 103, 104, 106, 107, 108, 59, 39, 96, 0, 92, 122, 120, 99, 118, 98, 110, 109, 44, 46, 47, 0, 42, 0, 32, // normal 0, 0, 33, 64, 35, 36, 37, 94, 38, 42, 40, 41, 95, 43, 0, 0, 81, 87, 69, 82, 84, 89, 85, 73, 79, 80, 123, 125, 0, 0, 65, 83, 68, 70, 71, 72, 74, 75, 76, 58, 34, 126, 0, 124, 90, 88, 67, 86, 66, 78, 77, 60, 62, 63, 0, 42, 0, 32 // shift }; // копируем в постоянное место LangInfo & lang = mCurrentLanguage->second; for (size_t i=0; i<INPUT_COUNT_LOAD_CHAR; i++) lang[i] = chars[i]; // добавляем клавиши для нумлока Char nums[13] = {55, 56, 57, 45, 52, 53, 54, 43, 49, 50, 51, 48, 46}; mNums.resize(13); // копируем в постоянное место for (size_t i=0; i<13; i++) mNums[i] = nums[i]; }
/* // This section is NOT 8086 and 386 , i.e., // _AXP // _PPC // _MIPS // // pass auxiliary information to back end */ CGPOINTER FEAuxInfo( CGPOINTER req_handle, int request ) { aux_info *inf; auto SYM_ENTRY sym; static hw_reg_set save_set; switch( request ) { case SOURCE_LANGUAGE: return( (CGPOINTER)"C" ); case OBJECT_FILE_NAME: return( (CGPOINTER)ObjFileName() ); case REVISION_NUMBER: return( (CGPOINTER)(pointer_int)II_REVISION ); case AUX_LOOKUP: return( req_handle ); case SOURCE_NAME: if( SrcFName == ModuleName ) { return( (CGPOINTER)FNameFullPath( FNames ) ); } else { return( (CGPOINTER)ModuleName ); } case CALL_CLASS: { static call_class cclass; cclass = GetCallClass( req_handle ); return( (CGPOINTER)&cclass ); } case NEXT_LIBRARY: case LIBRARY_NAME: return( NextLibrary( (int)(pointer_int)req_handle, request ) ); case NEXT_IMPORT: case IMPORT_NAME: return( NextImport( (int)(pointer_int)req_handle, request ) ); case NEXT_IMPORT_S: case IMPORT_NAME_S: return( NextImportS( (int)(pointer_int)req_handle, request ) ); case NEXT_ALIAS: case ALIAS_NAME: case ALIAS_SYMBOL: case ALIAS_SUBST_NAME: case ALIAS_SUBST_SYMBOL: return( NextAlias( (int)(pointer_int)req_handle, request ) ); case FREE_SEGMENT: return( NULL ); case TEMP_LOC_NAME: return( (CGPOINTER)(pointer_int)TEMP_LOC_QUIT ); case TEMP_LOC_TELL: return( NULL ); case NEXT_DEPENDENCY: if( CompFlags.emit_dependencies ) return( (CGPOINTER)NextDependency( (FNAMEPTR)req_handle ) ); return( NULL ); case DEPENDENCY_TIMESTAMP: return( (CGPOINTER)getFileDepTimeStamp( (FNAMEPTR)req_handle ) ); case DEPENDENCY_NAME: return( (CGPOINTER)FNameFullPath( (FNAMEPTR)req_handle ) ); default: break; } inf = FindInfo( &sym, req_handle ); switch( request ) { case SAVE_REGS: if( req_handle != 0 ) { inf = LangInfo( sym.mods, inf ); } else { sym.mods = 0; } save_set = inf->save; return( (CGPOINTER)&save_set ); case RETURN_REG: if( req_handle != 0 ) { inf = LangInfo( sym.mods, inf ); } return( (CGPOINTER)&inf->returns ); case CALL_BYTES: return( (CGPOINTER)inf->code ); case PARM_REGS: if( req_handle != 0 ) { inf = LangInfo( sym.mods, inf ); if( inf->code == NULL && VarFunc( &sym ) ) { return( (CGPOINTER)DefaultVarParms ); } } return( (CGPOINTER)inf->parms ); default: break; } return( NULL ); }
/* // This section is for // 8086 // 386 // // pass auxiliary information to back end */ CGPOINTER FEAuxInfo( CGPOINTER req_handle, int request ) { aux_info *inf; auto SYM_ENTRY sym; static hw_reg_set save_set; switch( request ) { case SOURCE_LANGUAGE: return( (CGPOINTER)"C" ); case STACK_SIZE_8087: return( (CGPOINTER)(pointer_int)Stack87 ); case CODE_GROUP: return( (CGPOINTER)GenCodeGroup ); case DATA_GROUP: return( (CGPOINTER)DataSegName ); case OBJECT_FILE_NAME: return( (CGPOINTER)ObjFileName() ); case REVISION_NUMBER: return( (CGPOINTER)(pointer_int)II_REVISION ); case AUX_LOOKUP: return( req_handle ); case PROEPI_DATA_SIZE: return( (CGPOINTER)(pointer_int)ProEpiDataSize ); case DBG_PREDEF_SYM: return( (CGPOINTER)SymDFAbbr ); case P5_CHIP_BUG_SYM: return( (CGPOINTER)SymChipBug ); case CODE_LABEL_ALIGNMENT: { static unsigned char Alignment[] = { 2, 1, 1 }; if( OptSize == 0 ) Alignment[1] = TARGET_INT; return( (CGPOINTER)Alignment ); } case CLASS_NAME: return( (CGPOINTER)SegClassName( (segment_id)(pointer_int)req_handle ) ); case USED_8087: CompFlags.pgm_used_8087 = 1; return( NULL ); #if _CPU == 386 case P5_PROF_DATA: return( (CGPOINTER)FunctionProfileBlock ); case P5_PROF_SEG: return( (CGPOINTER)(pointer_int)FunctionProfileSegment ); #endif case SOURCE_NAME: if( SrcFName == ModuleName ) { return( (CGPOINTER)FNameFullPath( FNames ) ); } else { return( (CGPOINTER)ModuleName ); } case CALL_CLASS: { static call_class cclass; cclass = GetCallClass( req_handle ); return( (CGPOINTER)&cclass ); } case FREE_SEGMENT: return( NULL ); case NEXT_LIBRARY: case LIBRARY_NAME: return( NextLibrary( (int)(pointer_int)req_handle, request ) ); case NEXT_IMPORT: case IMPORT_NAME: return( NextImport( (int)(pointer_int)req_handle, request ) ); case NEXT_IMPORT_S: case IMPORT_NAME_S: return( NextImportS( (int)(pointer_int)req_handle, request ) ); case NEXT_ALIAS: case ALIAS_NAME: case ALIAS_SYMBOL: case ALIAS_SUBST_NAME: case ALIAS_SUBST_SYMBOL: return( NextAlias( (int)(pointer_int)req_handle, request ) ); case TEMP_LOC_NAME: return( (CGPOINTER)(pointer_int)TEMP_LOC_QUIT ); case TEMP_LOC_TELL: return( NULL ); case NEXT_DEPENDENCY: if( CompFlags.emit_dependencies ) return( (CGPOINTER)NextDependency( (FNAMEPTR)req_handle ) ); return( NULL ); case DEPENDENCY_TIMESTAMP: return( (CGPOINTER)getFileDepTimeStamp( (FNAMEPTR)req_handle ) ); case DEPENDENCY_NAME: return( (CGPOINTER)FNameFullPath( (FNAMEPTR)req_handle ) ); case PEGGED_REGISTER: return( (CGPOINTER)SegPeggedReg( (segment_id)(pointer_int)req_handle ) ); default: break; } inf = FindInfo( &sym, req_handle ); switch( request ) { case SAVE_REGS: if( req_handle != 0 ) { inf = LangInfo( sym.mods, inf ); } else { sym.mods = 0; } save_set = inf->save; if( sym.mods & FLAG_SAVEREGS ) { HW_CTurnOn( save_set, HW_SEGS ); } #ifdef __SEH__ if( (SYM_HANDLE)req_handle == SymTryInit ) { HW_CTurnOff( save_set, HW_SP ); } #endif return( (CGPOINTER)&save_set ); case RETURN_REG: if( req_handle != 0 ) { inf = LangInfo( sym.mods, inf ); } return( (CGPOINTER)&inf->returns ); case CALL_BYTES: return( (CGPOINTER)inf->code ); case PARM_REGS: #ifdef __SEH__ if(( (SYM_HANDLE)req_handle == SymTryInit ) || ( (SYM_HANDLE)req_handle == SymTryFini ) || ( (SYM_HANDLE)req_handle == SymTryUnwind ) || ( (SYM_HANDLE)req_handle == SymExcept )) { return( (CGPOINTER)TryParms ); } #endif if( req_handle != 0 ) { inf = LangInfo( sym.mods, inf ); if( inf->code == NULL && VarFunc( &sym ) ) { return( (CGPOINTER)DefaultVarParms ); } } return( (CGPOINTER)inf->parms ); case STRETURN_REG: if( req_handle != 0 ) { inf = LangInfo( sym.mods, inf ); } return( (CGPOINTER)&inf->streturn ); default: break; } return( NULL ); }
struct aux_info *InfoLookup( SYMPTR sym ) { char *name; struct aux_info *inf; struct aux_entry *ent; name = sym->name; inf = &DefaultInfo; /* assume default */ if( name == NULL ) return( inf ); /* 01-jun-90 */ ent = AuxLookup( name ); if( ent != NULL ) inf = ent->info; if( ( ent == NULL ) || (sym->flags & SYM_INTRINSIC) ) { if( sym->flags & SYM_DEFINED ) return( inf ); if( !(sym->flags & SYM_INTRINSIC) ) { if( memcmp( name, "_inline_", 8 ) != 0 ) return( inf ); name += 8; } #if ( _CPU == 8086 ) || ( _CPU == 386 ) { struct inline_funcs *ifunc; ifunc = IF_Lookup( name ); if( ifunc == NULL ) return( inf ); #if ( _CPU == 8086 ) if( HW_CEqual( ifunc->returns, HW_DX_AX ) || HW_CEqual( ifunc->returns, HW_DS_SI ) || HW_CEqual( ifunc->returns, HW_ES_DI ) || HW_CEqual( ifunc->returns, HW_CX_DI ) ) { if( SizeOfArg( sym->sym_type->object ) != 4 ) { #else if( HW_CEqual( ifunc->returns, HW_DX_AX ) || HW_CEqual( ifunc->returns, HW_DS_ESI ) || HW_CEqual( ifunc->returns, HW_ES_EDI ) || HW_CEqual( ifunc->returns, HW_CX_DI ) ) { if( SizeOfArg( sym->sym_type->object ) != 6 ) { #endif return( inf ); } } inf = &InlineInfo; inf->cclass = (WatcallInfo.cclass & FAR) | MODIFY_EXACT; if( (sym->flags & SYM_INTRINSIC) && ( ent != NULL ) ) inf->cclass |= ent->info->cclass; inf->code = ifunc->code; inf->parms = ifunc->parms; inf->returns = ifunc->returns; #if ( _CPU == 8086 ) if( !HW_CEqual( inf->returns, HW_AX ) && !HW_CEqual( inf->returns, HW_EMPTY ) ) { #else if( !HW_CEqual( inf->returns, HW_EAX ) && !HW_CEqual( inf->returns, HW_EMPTY ) ) { #endif inf->cclass |= SPECIAL_RETURN; } HW_CAsgn( inf->streturn, HW_EMPTY ); inf->save = ifunc->save; inf->objname = WatcallInfo.objname; /* 26-jan-93 */ inf->use = 1; } #endif } return( inf ); } struct aux_info *FindInfo( SYM_ENTRY *sym, SYM_HANDLE sym_handle ) { SYM_ENTRY sym_typedef; struct aux_entry *ent; TYPEPTR typ; struct aux_info *inf; inf = &DefaultInfo; /* assume default */ if( sym_handle == 0 ) return( inf ); SymGet( sym, sym_handle ); #if _CPU == 386 if( (sym_handle == SymSTOSB) || (sym_handle == SymSTOSD) ) { return( &STOSBInfo ); } else if( sym_handle == SymFinally ) { static byte_seq FinallyCode = { 1, { 0xc3 } }; /* ret */ InlineInfo = WatcallInfo; InlineInfo.code = &FinallyCode; return( &InlineInfo ); } else if( sym_handle == SymTryFini ) { static hw_reg_set TryFiniParms[] = { HW_D( HW_EAX ), HW_D( HW_EMPTY ) }; static byte_seq TryFiniCode = { 6, { 0x64, 0xA3, 0, 0, 0, 0 } }; /* mov fs:[0],eax */ InlineInfo = WatcallInfo; InlineInfo.parms = TryFiniParms; InlineInfo.code = &TryFiniCode; return( &InlineInfo ); } #endif if( !(sym->flags & SYM_TEMP) ) { /* not an indirect func call*/ inf = InfoLookup( sym ); } if( inf == &DefaultInfo ) { typ = SkipDummyTypedef( sym->sym_type ); if( typ->decl_type == TYPE_TYPEDEF ) { SymGet( &sym_typedef, typ->u.typedefn ); if( sym_typedef.name != NULL ) { ent = AuxLookup( sym_typedef.name ); if( ent != NULL ) { inf = ent->info; } } } } #if _CPU == 386 if( ( inf->flags & AUX_FLAG_FAR16 ) || ( sym->attrib & FLAG_FAR16 ) ) { if( ( (sym->attrib & FLAG_LANGUAGES) == LANG_PASCAL ) || ( inf->cclass & REVERSE_PARMS ) ) { return( &Far16PascalInfo ); } else { return( &Far16CdeclInfo ); } } #endif return( inf ); } int FunctionAborts( SYM_ENTRY *sym, SYM_HANDLE sym_handle ) /* 09-apr-93 */ { struct aux_entry *ent; if( sym_handle != 0 ) { /* 19-apr-93 */ SymGet( sym, sym_handle ); ent = AuxLookup( SymName( sym, sym_handle ) ); if( ent != NULL ) { if( ent->info->cclass & SUICIDAL ) { return( 1 ); } } } return( 0 ); } void GetCallClass( SYM_HANDLE sym_handle ) { struct aux_info *inf; SYM_ENTRY sym; CallClass = DefaultInfo.cclass; if( sym_handle != 0 ) { inf = FindInfo( &sym, sym_handle ); if( sym.flags & SYM_FUNCTION ) { if( inf != &DefaultInfo ) { CallClass = inf->cclass; } else { CallClass = GetLangInfo( sym.attrib )->cclass; #if _CPU == 8086 if( TargSys == TS_WINDOWS ) { if( sym.attrib & (LANG_CDECL | LANG_PASCAL) ) { CallClass |= FAT_WINDOWS_PROLOG; } } #endif } #if ( _CPU == 8086 ) || ( _CPU == 386 ) if( CompFlags.emit_names ) { CallClass |= EMIT_FUNCTION_NAME; } if( sym.attrib & FLAG_FAR ) { CallClass |= FAR; if( sym.attrib & FLAG_NEAR ) { CallClass |= INTERRUPT; } } else if( sym.attrib & FLAG_NEAR ) { CallClass &= ~ FAR; } #endif #ifdef DLL_EXPORT if( sym.attrib & FLAG_EXPORT ) { /* 12-mar-90 */ CallClass |= DLL_EXPORT; } #endif #ifdef LOAD_DS_ON_ENTRY if( sym.attrib & FLAG_LOADDS ) { /* 26-apr-90 */ #if 0 /* John - 11-mar-93 */ /* 21-feb-93 */ if( TargSys == TS_WINDOWS ) { CallClass |= FAT_WINDOWS_PROLOG; } else { CallClass |= LOAD_DS_ON_ENTRY; } #else CallClass |= LOAD_DS_ON_ENTRY; #endif } #endif #ifdef MAKE_CALL_INLINE if( IsInLineFunc( sym_handle ) ) { CallClass |= MAKE_CALL_INLINE; } #endif if( VarFunc( &sym ) ) { CallClass |= CALLER_POPS | HAS_VARARGS; } } } #ifdef REVERSE CallClass &= ~ REVERSE_PARMS; /* 28-may-89 */ #endif #if ( _CPU == 8086 ) || ( _CPU == 386 ) if( sym_handle != 0 && sym.flags & SYM_FUNC_NEEDS_THUNK ) { CallClass |= THUNK_PROLOG; } #endif #ifdef PROLOG_HOOKS if( CompFlags.ep_switch_used != 0 ) { CallClass |= PROLOG_HOOKS; } #endif #ifdef EPILOG_HOOKS if( CompFlags.ee_switch_used != 0 ) { CallClass |= EPILOG_HOOKS; } #endif #ifdef GROW_STACK if( CompFlags.sg_switch_used ) { CallClass |= GROW_STACK; } #endif #ifdef TOUCH_STACK if( CompFlags.st_switch_used ) { CallClass |= TOUCH_STACK; } #endif } static time_t *getFileDepTimeStamp( FNAMEPTR flist ) { static time_t stamp; #if ( ( _CPU == 8086 ) || ( _CPU == 386 ) ) && ( COMP_CFG_COFF == 0 ) stamp = _timet2dos( flist->mtime ); #else stamp = flist->mtime; #endif return( &stamp ); } /* // NextLibrary // Called (indirectly) from the code generator to inject automagically defined symbols. // Inputs: // index (n-1) // Usually called from a loop until we return 0/NULL to show no more libraries // request // NEXT_LIBRARY // examines the current flags to see if any libraries should be // automagically referenced and returns the relevant index if so. // LIBRARY_NAME // returns the requested name. // */ static VOIDPTR NextLibrary( int index, aux_class request ) { struct library_list *liblist; char *name = NULL; int i; i = 0; if( request == NEXT_LIBRARY ) ++index; for( liblist = HeadLibs; liblist; liblist = liblist->next ) { name = &liblist->prio; ++i; if( i == index ) { break; } } if( liblist == NULL ) { switch( index - i ) { case 1: /* return 1 for CLIB */ name = CLIB_Name; if( CompFlags.emit_library_any ) break; if( CompFlags.emit_library_with_main ) { if( CompFlags.has_main ) break; if( CompFlags.has_winmain ) break; if( CompFlags.bd_switch_used ) break; if( CompFlags.has_libmain ) break; if( CompFlags.bm_switch_used ) break; /* JBS */ ++index; } else { name = NULL; index = 0; // indicate all done } break; /* // MATHLIB is always referenced as a default library because // the linker wont include anything without a 'real' referenced // symbol */ case 2: /* return 2 for MATHLIB */ name = MATHLIB_Name; break; case 3: /* return 3 for EMULIB */ name = EmuLib_Name; if( EmuLib_Name != NULL ) break; // fall through case 4: /* used to be PCODE */ name = NULL; index = 0; // indicate all done break; default: break; } } /* // return library name, or */ if( request == LIBRARY_NAME ) return( name ); /* // library index */ return( (char *)index ); } // NextAlias // Called (indirectly) from the code generator to go through the list of // linker aliases. // Inputs: // index (n-1) // Called from a loop until we return 0/NULL to show no more aliases // request // NEXT_ALIAS // returns the index of next alias in the list, or zero if none. // ALIAS_NAME // returns the alias name, or NULL if alias refers to a symbol. // ALIAS_SYMBOL // returns the alias symbol, or NULL if alias refers to a name. // ALIAS_SUBSTITUTE // returns the name to be substituted for the alias. // // Note: One of ALIAS_NAME and ALIAS_SYMBOL will always be 0/NULL and the other // will be valid, depending on which form of the pragma was used. static VOIDPTR NextAlias( int index, aux_class request ) { struct alias_list *aliaslist; SYM_HANDLE alias_sym = NULL; SYM_HANDLE subst_sym = NULL; const char *alias_name = NULL; const char *subst_name = NULL; int i; if( request == NEXT_ALIAS ) ++index; for( i = 1, aliaslist = AliasHead; aliaslist; aliaslist = aliaslist->next, ++i ) { alias_name = aliaslist->name; alias_sym = aliaslist->a_sym; subst_name = aliaslist->subst; subst_sym = aliaslist->s_sym; if( i == index ) { break; } } if( aliaslist == NULL ) index = 0; /* no (more) aliases */ if( request == ALIAS_NAME ) { return( (VOIDPTR)alias_name ); } else if( request == ALIAS_SYMBOL ) { return( (VOIDPTR)alias_sym ); } else if( request == ALIAS_SUBST_NAME ) { return( (VOIDPTR)subst_name ); } else if( request == ALIAS_SUBST_SYMBOL ) { return( (VOIDPTR)subst_sym ); } else { // this had better be a NEXT_ALIAS request return( (VOIDPTR)index ); } } /* Return the size of function parameters or -1 if size could * not be determined (symbol isn't a function or is variadic) */ static int GetParmsSize( CGSYM_HANDLE sym_handle ) { int total_parm_size = 0; int parm_size; TYPEPTR fn_typ; TYPEPTR *parm; TYPEPTR typ; SYM_ENTRY sym; SymGet( &sym, sym_handle ); fn_typ = sym.sym_type; SKIP_TYPEDEFS( fn_typ ); if( fn_typ->decl_type == TYPE_FUNCTION ) { parm = fn_typ->u.fn.parms; if( parm != NULL ) { for( ; (typ = *parm); ++parm ) { if( typ->decl_type == TYPE_DOT_DOT_DOT ) { total_parm_size = -1; break; } SKIP_TYPEDEFS( typ ); if( typ->decl_type == TYPE_VOID ) break; parm_size = TypeSize( typ ); parm_size = (parm_size + sizeof( target_int ) - 1) & -sizeof( target_int ); total_parm_size += parm_size; } } } else { total_parm_size = -1; } return( total_parm_size ); } /* // Return name pattern manipulator string */ static char *GetNamePattern( CGSYM_HANDLE sym_handle ) { char *pattern; SYM_ENTRY sym; struct aux_info *inf; inf = FindInfo( &sym, sym_handle ); #ifdef __SEH__ if(( sym_handle == SymTryInit ) || ( sym_handle == SymTryFini ) || ( sym_handle == SymTryUnwind ) || ( sym_handle == SymExcept )) { pattern = "*"; } else { #endif inf = LangInfo( sym.attrib, inf ); if( sym.flags & SYM_FUNCTION ) { pattern = inf->objname; #if ( _CPU == 386 ) || ( _CPU == 8086 ) if( VarFunc( &sym ) ) { if( inf == &DefaultInfo ) inf = DftCallConv; if( inf == &StdcallInfo ) { pattern = CdeclInfo.objname; } else if( inf == &FastcallInfo ) { pattern = CdeclInfo.objname; } } #endif if( pattern == NULL ) { pattern = TS_CODE_MANGLE; } } else { pattern = VarNamePattern( inf ); if( pattern == NULL ) { pattern = TS_DATA_MANGLE; } } #ifdef __SEH__ } // close that else #endif return( pattern ); }
/* // pass auxiliary information to back end */ VOIDPTR FEAuxInfo( CGSYM_HANDLE cgsym_handle, int request ) { SYM_HANDLE sym_handle = cgsym_handle; struct aux_info *inf; auto SYM_ENTRY sym; static hw_reg_set save_set; switch( request ) { case SOURCE_LANGUAGE: return( "C" ); case OBJECT_FILE_NAME: return( (VOIDPTR)ObjFileName( OBJ_EXT ) ); case REVISION_NUMBER: return( (VOIDPTR)II_REVISION ); case AUX_LOOKUP: return( (VOIDPTR)sym_handle ); case SOURCE_NAME: if( SrcFName == ModuleName ) { return( FNameFullPath( FNames ) ); } else { return( ModuleName ); } case CALL_CLASS: GetCallClass( sym_handle ); return( &CallClass ); case NEXT_LIBRARY: case LIBRARY_NAME: return( NextLibrary( (int)sym_handle, request ) ); case NEXT_IMPORT: case IMPORT_NAME: return( NextImport( (int)sym_handle, request ) ); case NEXT_IMPORT_S: case IMPORT_NAME_S: return( NextImportS( (int)sym_handle, request ) ); case NEXT_ALIAS: case ALIAS_NAME: case ALIAS_SYMBOL: case ALIAS_SUBST_NAME: case ALIAS_SUBST_SYMBOL: return( NextAlias( (int)sym_handle, request ) ); case FREE_SEGMENT: return( NULL ); case TEMP_LOC_NAME: return( (char *)TEMP_LOC_QUIT ); case TEMP_LOC_TELL: return( NULL ); case NEXT_DEPENDENCY: /* 03-dec-92 */ if( CompFlags.emit_dependencies ) return( NextDependency( (FNAMEPTR) cgsym_handle ) ); return( NULL ); case DEPENDENCY_TIMESTAMP: return( getFileDepTimeStamp( (FNAMEPTR)cgsym_handle ) ); case DEPENDENCY_NAME: return( FNameFullPath( (FNAMEPTR)cgsym_handle ) ); default: break; } inf = FindInfo( &sym, sym_handle ); switch( request ) { case SAVE_REGS: if( sym_handle != 0 ) { inf = LangInfo( sym.attrib, inf ); } else { sym.attrib = 0; } save_set = inf->save; return( &save_set ); case RETURN_REG: if( sym_handle != 0 ) { inf = LangInfo( sym.attrib, inf ); } return( &inf->returns ); case CALL_BYTES: return( inf->code ); case PARM_REGS: if( sym_handle != 0 ) { inf = LangInfo( sym.attrib, inf ); if( inf->code == NULL && VarFunc( &sym ) ) { return( DefaultVarParms ); } } return( inf->parms ); default: break; } return( NULL ); }