⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tm-convex.h

📁 arm-linux-gcc编译器
💻 H
📖 第 1 页 / 共 2 页
字号:
/* OBSOLETE  *//* OBSOLETE /* Describe the pointer in each stack frame to the previous stack frame *//* OBSOLETE    (its caller).  *x/ *//* OBSOLETE  *//* OBSOLETE /* FRAME_CHAIN takes a frame_info with a frame's nominal address in fi->frame, *//* OBSOLETE    and produces the frame's chain-pointer. *x/ *//* OBSOLETE  *//* OBSOLETE /* (caller fp is saved at 8(fp)) *x/ *//* OBSOLETE  *//* OBSOLETE #define FRAME_CHAIN(fi)   (read_memory_integer ((fi)->frame + 8, 4)) *//* OBSOLETE  *//* OBSOLETE /* Define other aspects of the stack frame.  *x/ *//* OBSOLETE  *//* OBSOLETE /* We need the boundaries of the text in the exec file, as a kludge, *//* OBSOLETE    for FRAMELESS_FUNCTION_INVOCATION and CALL_DUMMY_LOCATION. *x/ *//* OBSOLETE  *//* OBSOLETE #define     NEED_TEXT_START_END 1 *//* OBSOLETE  *//* OBSOLETE /* An expression that tells us whether the function invocation represented *//* OBSOLETE    by FI does not have a frame on the stack associated with it. *//* OBSOLETE    On convex, check at the return address for `callq' -- if so, frameless, *//* OBSOLETE    otherwise, not.  *x/ *//* OBSOLETE  *//* OBSOLETE extern int convex_frameless_function_invocation PARAMS ((struct frame_info *fi)); *//* OBSOLETE #define FRAMELESS_FUNCTION_INVOCATION(FI) (convex_frameless_function_invocatio (FI)) *//* OBSOLETE  *//* OBSOLETE #define FRAME_SAVED_PC(fi) (read_memory_integer ((fi)->frame, 4)) *//* OBSOLETE  *//* OBSOLETE #define FRAME_ARGS_ADDRESS(fi) (read_memory_integer ((fi)->frame + 12, 4)) *//* OBSOLETE  *//* OBSOLETE #define FRAME_LOCALS_ADDRESS(fi) (fi)->frame *//* OBSOLETE  *//* OBSOLETE /* Return number of args passed to a frame. *//* OBSOLETE    Can return -1, meaning no way to tell.  *x/ *//* OBSOLETE  *//* OBSOLETE extern int convex_frame_num_args PARAMS ((struct frame_info *fi)); *//* OBSOLETE #define FRAME_NUM_ARGS(fi) (convex_frame_num_args ((fi))) *//* OBSOLETE  *//* OBSOLETE /* Return number of bytes at start of arglist that are not really args.  *x/ *//* OBSOLETE  *//* OBSOLETE #define FRAME_ARGS_SKIP 0 *//* OBSOLETE  *//* OBSOLETE /* Put here the code to store, into a struct frame_saved_regs, *//* OBSOLETE    the addresses of the saved registers of frame described by FRAME_INFO. *//* OBSOLETE    This includes special registers such as pc and fp saved in special *//* OBSOLETE    ways in the stack frame.  sp is even more special: *//* OBSOLETE    the address we return for it IS the sp for the next frame.  *x/ *//* OBSOLETE  *//* OBSOLETE /* Normal (short) frames save only PC, FP, (callee's) AP.  To reasonably *//* OBSOLETE    handle gcc and pcc register variables, scan the code following the *//* OBSOLETE    call for the instructions the compiler inserts to reload register *//* OBSOLETE    variables from stack slots and record the stack slots as the saved *//* OBSOLETE    locations of those registers.  This will occasionally identify some *//* OBSOLETE    random load as a saved register; this is harmless.  vc does not *//* OBSOLETE    declare its register allocation actions in the stabs.  *x/ *//* OBSOLETE  *//* OBSOLETE #define FRAME_FIND_SAVED_REGS(frame_info, frame_saved_regs)         \ *//* OBSOLETE { register int regnum;                                                      \ *//* OBSOLETE   register int frame_length =       /* 3 short, 2 long, 1 extended, 0 context *x/\ *//* OBSOLETE       (read_memory_integer ((frame_info)->frame + 4, 4) >> 25) & 3; \ *//* OBSOLETE   register CORE_ADDR frame_fp =                                             \ *//* OBSOLETE       read_memory_integer ((frame_info)->frame + 8, 4);                     \ *//* OBSOLETE   register CORE_ADDR next_addr;                                             \ *//* OBSOLETE   memset (&frame_saved_regs, '\0', sizeof frame_saved_regs);                        \ *//* OBSOLETE   (frame_saved_regs).regs[PC_REGNUM] = (frame_info)->frame + 0;             \ *//* OBSOLETE   (frame_saved_regs).regs[PS_REGNUM] = (frame_info)->frame + 4;             \ *//* OBSOLETE   (frame_saved_regs).regs[FP_REGNUM] = (frame_info)->frame + 8;             \ *//* OBSOLETE   (frame_saved_regs).regs[AP_REGNUM] = frame_fp + 12;                       \ *//* OBSOLETE   next_addr = (frame_info)->frame + 12;                                     \ *//* OBSOLETE   if (frame_length < 3)                                                     \ *//* OBSOLETE     for (regnum = A5_REGNUM; regnum < SP_REGNUM; ++regnum)          \ *//* OBSOLETE       (frame_saved_regs).regs[regnum] = (next_addr += 4);           \ *//* OBSOLETE   if (frame_length < 2)                                                     \ *//* OBSOLETE     (frame_saved_regs).regs[SP_REGNUM] = (next_addr += 4);          \ *//* OBSOLETE   next_addr -= 4;                                                   \ *//* OBSOLETE   if (frame_length < 3)                                                     \ *//* OBSOLETE     for (regnum = S7_REGNUM; regnum < S0_REGNUM; ++regnum)          \ *//* OBSOLETE       (frame_saved_regs).regs[regnum] = (next_addr += 8);           \ *//* OBSOLETE   if (frame_length < 2)                                                     \ *//* OBSOLETE     (frame_saved_regs).regs[S0_REGNUM] = (next_addr += 8);          \ *//* OBSOLETE   else                                                                      \ *//* OBSOLETE     (frame_saved_regs).regs[SP_REGNUM] = next_addr + 8;                     \ *//* OBSOLETE   if (frame_length == 3) {                                          \ *//* OBSOLETE     CORE_ADDR pc = read_memory_integer ((frame_info)->frame, 4);    \ *//* OBSOLETE     int op, ix, disp;                                                       \ *//* OBSOLETE     op = read_memory_integer (pc, 2);                                       \ *//* OBSOLETE     if ((op & 0xffc7) == 0x1480) pc += 4;   /* add.w #-,sp *x/      \ *//* OBSOLETE     else if ((op & 0xffc7) == 0x58c0) pc += 2;      /* add.w #-,sp *x/      \ *//* OBSOLETE     op = read_memory_integer (pc, 2);                                       \ *//* OBSOLETE     if ((op & 0xffc7) == 0x2a06) pc += 4;   /* ld.w -,ap *x/                \ *//* OBSOLETE     for (;;) {                                                              \ *//* OBSOLETE       op = read_memory_integer (pc, 2);                                     \ *//* OBSOLETE       ix = (op >> 3) & 7;                                           \ *//* OBSOLETE       if ((op & 0xfcc0) == 0x2800) {                /* ld.- -,ak *x/                \ *//* OBSOLETE         regnum = SP_REGNUM - (op & 7);                                      \ *//* OBSOLETE     disp = read_memory_integer (pc + 2, 2);                         \ *//* OBSOLETE     pc += 4;}                                                       \ *//* OBSOLETE       else if ((op & 0xfcc0) == 0x2840) {   /* ld.- -,ak *x/                \ *//* OBSOLETE         regnum = SP_REGNUM - (op & 7);                                      \ *//* OBSOLETE     disp = read_memory_integer (pc + 2, 4);                         \ *//* OBSOLETE     pc += 6;}                                                       \ *//* OBSOLETE       if ((op & 0xfcc0) == 0x3000) {                /* ld.- -,sk *x/                \ *//* OBSOLETE         regnum = S0_REGNUM - (op & 7);                                      \ *//* OBSOLETE     disp = read_memory_integer (pc + 2, 2);                         \ *//* OBSOLETE     pc += 4;}                                                       \ *//* OBSOLETE       else if ((op & 0xfcc0) == 0x3040) {   /* ld.- -,sk *x/                \ *//* OBSOLETE         regnum = S0_REGNUM - (op & 7);                                      \ *//* OBSOLETE     disp = read_memory_integer (pc + 2, 4);                         \ *//* OBSOLETE     pc += 6;}                                                       \ *//* OBSOLETE       else if ((op & 0xff00) == 0x7100) {   /* br crossjump *x/     \ *//* OBSOLETE         pc += 2 * (char) op;                                                \ *//* OBSOLETE         continue;}                                                  \ *//* OBSOLETE       else if (op == 0x0140) {                      /* jmp crossjump *x/    \ *//* OBSOLETE         pc = read_memory_integer (pc + 2, 4);                               \ *//* OBSOLETE         continue;}                                                  \ *//* OBSOLETE       else break;                                                   \ *//* OBSOLETE       if ((frame_saved_regs).regs[regnum])                          \ *//* OBSOLETE     break;                                                          \ *//* OBSOLETE       if (ix == 7) disp += frame_fp;                                        \ *//* OBSOLETE       else if (ix == 6) disp += read_memory_integer (frame_fp + 12, 4);     \ *//* OBSOLETE       else if (ix != 0) break;                                              \ *//* OBSOLETE       (frame_saved_regs).regs[regnum] =                                     \ *//* OBSOLETE     disp - 8 + (1 << ((op >> 8) & 3));                              \ *//* OBSOLETE       if (regnum >= S7_REGNUM)                                              \ *//* OBSOLETE         (frame_saved_regs).regs[regnum - S0_REGNUM + s0_REGNUM] =   \ *//* OBSOLETE       disp - 4 + (1 << ((op >> 8) & 3));                            \ *//* OBSOLETE     }                                                                       \ *//* OBSOLETE   }                                                                 \ *//* OBSOLETE } *//* OBSOLETE  *//* OBSOLETE /* Things needed for making the inferior call functions.  *x/ *//* OBSOLETE  *//* OBSOLETE #define     CALL_DUMMY_LOCATION     BEFORE_TEXT_END *//* OBSOLETE  *//* OBSOLETE /* Push an empty stack frame, to record the current PC, etc.  *x/ *//* OBSOLETE  *//* OBSOLETE #define PUSH_DUMMY_FRAME \ *//* OBSOLETE { register CORE_ADDR sp = read_register (SP_REGNUM);                        \ *//* OBSOLETE   register int regnum;                                                      \ *//* OBSOLETE   char buf[8];                                                              \ *//* OBSOLETE   long word;                                                                \ *//* OBSOLETE   for (regnum = S0_REGNUM; regnum >= S7_REGNUM; --regnum) {                 \ *//* OBSOLETE     read_register_bytes (REGISTER_BYTE (regnum), buf, 8);           \ *//* OBSOLETE     sp = push_bytes (sp, buf, 8);}                                  \ *//* OBSOLETE   for (regnum = SP_REGNUM; regnum >= FP_REGNUM; --regnum) {                 \ *//* OBSOLETE     word = read_register (regnum);                                  \ *//* OBSOLETE     sp = push_bytes (sp, &word, 4);}                                        \ *//* OBSOLETE   word = (read_register (PS_REGNUM) &~ (3<<25)) | (1<<25);          \ *//* OBSOLETE   sp = push_bytes (sp, &word, 4);                                   \ *//* OBSOLETE   word = read_register (PC_REGNUM);                                 \ *//* OBSOLETE   sp = push_bytes (sp, &word, 4);                                           \ *//* OBSOLETE   write_register (SP_REGNUM, sp);                                   \ *//* OBSOLETE   write_register (FP_REGNUM, sp);                                   \ *//* OBSOLETE   write_register (AP_REGNUM, sp);} *//* OBSOLETE  *//* OBSOLETE /* Discard from the stack the innermost frame, restoring all registers.  *x/ *//* OBSOLETE  *//* OBSOLETE #define POP_FRAME  do {\ *//* OBSOLETE   register CORE_ADDR fp = read_register (FP_REGNUM);            \ *//* OBSOLETE   register int regnum;                                          \ *//* OBSOLETE   register int frame_length =       /* 3 short, 2 long, 1 extended, 0 context *x/ \ *//* OBSOLETE       (read_memory_integer (fp + 4, 4) >> 25) & 3;          \ *//* OBSOLETE   char buf[8];                                                  \ *//* OBSOLETE   write_register (PC_REGNUM, read_memory_integer (fp, 4));  \ *//* OBSOLETE   write_register (PS_REGNUM, read_memory_integer (fp += 4, 4));  \ *//* OBSOLETE   write_register (FP_REGNUM, read_memory_integer (fp += 4, 4));  \ *//* OBSOLETE   write_register (AP_REGNUM, read_memory_integer (fp += 4, 4));  \ *//* OBSOLETE   if (frame_length < 3)                                  \ *//* OBSOLETE     for (regnum = A5_REGNUM; regnum < SP_REGNUM; ++regnum)   \ *//* OBSOLETE       write_register (regnum, read_memory_integer (fp += 4, 4)); \ *//* OBSOLETE   if (frame_length < 2)                                          \ *//* OBSOLETE     write_register (SP_REGNUM, read_memory_integer (fp += 4, 4)); \ *//* OBSOLETE   fp -= 4;                                                  \ *//* OBSOLETE   if (frame_length < 3)                                     \ *//* OBSOLETE     for (regnum = S7_REGNUM; regnum < S0_REGNUM; ++regnum) {        \ *//* OBSOLETE       read_memory (fp += 8, buf, 8);                                \ *//* OBSOLETE       write_register_bytes (REGISTER_BYTE (regnum), buf, 8);}   \ *//* OBSOLETE   if (frame_length < 2)     {                                       \ *//* OBSOLETE     read_memory (fp += 8, buf, 8);                          \ *//* OBSOLETE     write_register_bytes (REGISTER_BYTE (regnum), buf, 8);}     \ *//* OBSOLETE   else write_register (SP_REGNUM, fp + 8);                  \ *//* OBSOLETE   flush_cached_frames ();                                   \ *//* OBSOLETE } while (0) *//* OBSOLETE  *//* OBSOLETE /* This sequence of words is the instructions *//* OBSOLETE      mov sp,ap *//* OBSOLETE      pshea 69696969 *//* OBSOLETE      calls 32323232 *//* OBSOLETE      bkpt *//* OBSOLETE    Note this is 16 bytes.  *x/ *//* OBSOLETE  *//* OBSOLETE #define CALL_DUMMY {0x50860d4069696969LL,0x2140323232327d50LL} *//* OBSOLETE  *//* OBSOLETE #define CALL_DUMMY_LENGTH 16 *//* OBSOLETE  *//* OBSOLETE #define CALL_DUMMY_START_OFFSET 0 *//* OBSOLETE  *//* OBSOLETE /* Insert the specified number of args and function address *//* OBSOLETE    into a call sequence of the above form stored at DUMMYNAME.  *x/ *//* OBSOLETE  *//* OBSOLETE #define FIX_CALL_DUMMY(dummyname, pc, fun, nargs, args, type, gcc_p)   \ *//* OBSOLETE { *(int *)((char *) dummyname + 4) = nargs; \ *//* OBSOLETE   *(int *)((char *) dummyname + 10) = fun; } *//* OBSOLETE  *//* OBSOLETE /* Defs to read soff symbol tables, see dbxread.c *x/ *//* OBSOLETE  *//* OBSOLETE #define NUMBER_OF_SYMBOLS    ((long) opthdr.o_nsyms) *//* OBSOLETE #define STRING_TABLE_OFFSET  ((long) filehdr.h_strptr) *//* OBSOLETE #define SYMBOL_TABLE_OFFSET  ((long) opthdr.o_symptr) *//* OBSOLETE #define STRING_TABLE_SIZE    ((long) filehdr.h_strsiz) *//* OBSOLETE #define SIZE_OF_TEXT_SEGMENT ((long) txthdr.s_size) *//* OBSOLETE #define ENTRY_POINT          ((long) opthdr.o_entry) *//* OBSOLETE  *//* OBSOLETE #define READ_STRING_TABLE_SIZE(BUFFER) \ *//* OBSOLETE     (BUFFER = STRING_TABLE_SIZE) *//* OBSOLETE  *//* OBSOLETE #define DECLARE_FILE_HEADERS \ *//* OBSOLETE   FILEHDR filehdr;                                                  \ *//* OBSOLETE   OPTHDR opthdr;                                                    \ *//* OBSOLETE   SCNHDR txthdr *//* OBSOLETE  *//* OBSOLETE #define READ_FILE_HEADERS(DESC,NAME) \ *//* OBSOLETE {                                                                   \ *//* OBSOLETE   int n;                                                            \ *//* OBSOLETE   val = myread (DESC, &filehdr, sizeof filehdr);                    \ *//* OBSOLETE   if (val < 0)                                                              \ *//* OBSOLETE     perror_with_name (NAME);                                                \ *//* OBSOLETE   if (! IS_SOFF_MAGIC (filehdr.h_magic))                            \ *//* OBSOLETE     error ("%s: not an executable file.", NAME);                    \ *//* OBSOLETE   lseek (DESC, 0L, 0);                                                      \ *//* OBSOLETE   if (myread (DESC, &filehdr, sizeof filehdr) < 0)                  \ *//* OBSOLETE     perror_with_name (NAME);                                                \ *//* OBSOLETE   if (myread (DESC, &opthdr, filehdr.h_opthdr) <= 0)                        \ *//* OBSOLETE     perror_with_name (NAME);                                                \ *//* OBSOLETE   for (n = 0; n < filehdr.h_nscns; n++)                                     \ *//* OBSOLETE     {                                                                       \ *//* OBSOLETE       if (myread (DESC, &txthdr, sizeof txthdr) < 0)                        \ *//* OBSOLETE     perror_with_name (NAME);                                        \ *//* OBSOLETE       if ((txthdr.s_flags & S_TYPMASK) == S_TEXT)                   \ *//* OBSOLETE     break;                                                          \ *//* OBSOLETE     }                                                                       \ *//* OBSOLETE } */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -