From 7621d407168db379f783f2bb22aa4e5169e44fa8 Mon Sep 17 00:00:00 2001 From: seppel Date: Wed, 9 Jul 2008 23:10:28 +0000 Subject: [PATCH 01/53] . --- htformat.cc | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/htformat.cc b/htformat.cc index 70181d3..a088484 100644 --- a/htformat.cc +++ b/htformat.cc @@ -2266,7 +2266,7 @@ void ht_uformat_viewer::handlemsg(htmsg *msg) return; case K_Backspace: { FileOfs f; - if (edit() && cursor_tag_class == tag_class_edit + if (edit() && (cursor_tag_class == tag_class_edit) && get_current_offset(&f)) { file->cntl(FCNTL_MODS_CLEAR_DIRTY_RANGE, f, 1); cursor_left(); @@ -2277,9 +2277,9 @@ void ht_uformat_viewer::handlemsg(htmsg *msg) return; } case K_Tab: { - int c = cursor.tag_group; + int c=cursor.tag_group; cursor_tab(); - if (cursor.tag_group != c) { + if (cursor.tag_group!=c) { focus_cursor(); update_visual_info(); dirtyview(); @@ -2289,7 +2289,7 @@ void ht_uformat_viewer::handlemsg(htmsg *msg) break; } case K_Home: - if (cursor_state == cursor_state_visible) { + if (cursor_state==cursor_state_visible) { select_mode_pre(); cursor_home(); select_mode_post(0); @@ -2300,7 +2300,7 @@ void ht_uformat_viewer::handlemsg(htmsg *msg) } break; case K_End: - if (cursor_state == cursor_state_visible) { + if (cursor_state==cursor_state_visible) { select_mode_pre(); cursor_end(); select_mode_post(0); @@ -2311,13 +2311,13 @@ void ht_uformat_viewer::handlemsg(htmsg *msg) } break; case K_Control_Left: - xscroll -= 2; - if (xscroll < 0) xscroll = 0; + xscroll-=2; + if (xscroll<0) xscroll=0; dirtyview(); clearmsg(msg); return; case K_Control_Right: - xscroll += 2; + xscroll+=2; dirtyview(); clearmsg(msg); return; @@ -2736,8 +2736,9 @@ void ht_uformat_viewer::handlemsg(htmsg *msg) FileOfs o = 0; if (get_current_offset(&o)) { uint32 s; - get_current_tag_size(&s); - o += s; + if (get_current_tag_size(&s)) { + o += s; + } } if (!o) o = clipboard_getsize(); From 260c2e8ac2a04996203406d67ba5cac64168a0ff Mon Sep 17 00:00:00 2001 From: seppel Date: Tue, 14 Oct 2008 16:41:58 +0000 Subject: [PATCH 02/53] . --- elfstruc.h | 81 +++++++- htanaly.cc | 3 +- htelfhd.cc | 8 +- minilzo/README.LZO | 38 ++-- minilzo/lzoconf.h | 14 +- minilzo/lzodefs.h | 420 ++++++++++++++++++++++++++++++++-------- minilzo/minilzo.c | 466 ++++++++++++++++++++++++++++++++++++--------- minilzo/minilzo.h | 10 +- 8 files changed, 834 insertions(+), 206 deletions(-) diff --git a/elfstruc.h b/elfstruc.h index 1851d0e..2a2d441 100644 --- a/elfstruc.h +++ b/elfstruc.h @@ -122,6 +122,8 @@ typedef uint16 elf64_quarter; #define ELF_EM_960 19 /* Intel 80960 */ #define ELF_EM_PPC 20 /* PowerPC */ #define ELF_EM_PPC64 21 /* 64-bit PowerPC */ +#define ELF_EM_S390 22 /* IBM S/390 */ +#define ELF_EM_SPU 23 /* Sony/Toshiba/IBM SPU */ #define ELF_EM_V800 36 /* NEC V800 series */ #define ELF_EM_FR20 37 /* Fujitsu FR20 */ @@ -151,7 +153,9 @@ typedef uint16 elf64_quarter; #define ELF_EM_ST100 60 /* STMicroelectronics ST100 processor */ #define ELF_EM_TINYJ 61 /* Advanced Logic Corp. TinyJ embedded processor */ #define ELF_EM_X86_64 62 /* X86-64 (AMD Opteron) */ - +#define ELF_EM_PDSP 63 /* Sony DSP Processor */ +#define ELF_EM_PDP10 64 /* Digital Equipment Corp. PDP-10 */ +#define ELF_EM_PDP11 65 /* Digital Equipment Corp. PDP-11 */ #define ELF_EM_FX66 66 /* Siemens FX66 microcontroller */ #define ELF_EM_ST9PLUS 67 /* STMicroelectronics ST9+ 8/16 bit microcontroller */ #define ELF_EM_ST7 68 /* STMicroelectronics ST7 8-bit microcontroller */ @@ -162,8 +166,81 @@ typedef uint16 elf64_quarter; #define ELF_EM_SVX 73 /* Silicon Graphics SVx */ #define ELF_EM_ST19 74 /* STMicroelectronics ST19 8-bit microcontroller */ #define ELF_EM_VAX 75 /* Digital VAX */ +#define ELF_EM_CRIS 76 /* Axis Communications 32-bit embedded processor */ +#define ELF_EM_JAVELIN 77 /* Infineon Technologies 32-bit embedded cpu */ +#define ELF_EM_FIREPATH 78 /* Element 14 64-bit DSP processor */ +#define ELF_EM_ZSP 79 /* LSI Logic's 16-bit DSP processor */ +#define ELF_EM_MMIX 80 /* Donald Knuth's educational 64-bit processor */ +#define ELF_EM_HUANY 81 /* Harvard's machine-independent format */ +#define ELF_EM_PRISM 82 /* SiTera Prism */ +#define ELF_EM_AVR 83 /* Atmel AVR 8-bit microcontroller */ +#define ELF_EM_FR30 84 /* Fujitsu FR30 */ +#define ELF_EM_D10V 85 /* Mitsubishi D10V */ +#define ELF_EM_D30V 86 /* Mitsubishi D30V */ +#define ELF_EM_V850 87 /* NEC v850 */ +#define ELF_EM_M32R 88 /* Renesas M32R (formerly Mitsubishi M32R) */ +#define ELF_EM_MN10300 89 /* Matsushita MN10300 */ +#define ELF_EM_MN10200 90 /* Matsushita MN10200 */ +#define ELF_EM_PJ 91 /* picoJava */ +#define ELF_EM_OPENRISC 92 /* OpenRISC 32-bit embedded processor */ +#define ELF_EM_ARC_A5 93 /* ARC Cores Tangent-A5 */ +#define ELF_EM_XTENSA 94 /* Tensilica Xtensa Architecture */ +#define ELF_EM_VIDEOCORE 95 /* Alphamosaic VideoCore processor */ +#define ELF_EM_TMM_GPP 96 /* Thompson Multimedia General Purpose Processor */ +#define ELF_EM_NS32K 97 /* National Semiconductor 32000 series */ +#define ELF_EM_TPC 98 /* Tenor Network TPC processor */ +#define ELF_EM_SNP1K 99 /* Trebia SNP 1000 processor */ +#define ELF_EM_ST200 100 /* STMicroelectronics ST200 microcontroller */ +#define ELF_EM_IP2K 101 /* Ubicom IP2022 micro controller */ +#define ELF_EM_MAX 102 /* MAX Processor */ +#define ELF_EM_CR 103 /* National Semiconductor CompactRISC */ +#define ELF_EM_F2MC16 104 /* Fujitsu F2MC16 */ +#define ELF_EM_MSP430 105 /* TI msp430 micro controller */ +#define ELF_EM_BLACKFIN 106 /* ADI Blackfin */ +#define ELF_EM_SE_C33 107 /* S1C33 Family of Seiko Epson processors */ +#define ELF_EM_SEP 108 /* Sharp embedded microprocessor */ +#define ELF_EM_ARCA 109 /* Arca RISC Microprocessor */ +#define ELF_EM_UNICORE 110 /* Microprocessor series from PKU-Unity Ltd. and MPRC of Peking University */ +#define ELF_EM_EXCESS 111 /* eXcess: 16/32/64-bit configurable embedded CPU */ +#define ELF_EM_DXP 112 /* Icera Semiconductor Inc. Deep Execution Processor */ +#define ELF_EM_ALTERA_NIOS2 113 /* Altera Nios II soft-core processor */ +#define ELF_EM_CRX 114 /* National Semiconductor CRX */ +#define ELF_EM_XGATE 115 /* Motorola XGATE embedded processor */ +#define ELF_EM_C166 116 /* Infineon C16x/XC16x processor */ +#define ELF_EM_M16C 117 /* Renesas M16C series microprocessors */ +#define ELF_EM_DSPIC30F 118 /* Microchip Technology dsPIC30F Digital Signal Controller */ +#define ELF_EM_CE 119 /* Freescale Communication Engine RISC core */ +#define ELF_EM_M32C 120 /* Renesas M32C series microprocessors */ + +#define ELF_EM_TSK3000 131 /* Altium TSK3000 core */ +#define ELF_EM_RS08 132 /* Freescale RS08 embedded processor */ + +#define ELF_EM_ECOG2 134 /* Cyan Technology eCOG2 microprocessor */ +#define ELF_EM_SCORE 135 /* Sunplus Score */ +#define ELF_EM_DSP24 136 /* New Japan Radio (NJR) 24-bit DSP Processor */ +#define ELF_EM_VIDEOCORE3 137 /* Broadcom VideoCore III processor */ +#define ELF_EM_LATTICEMICO32 138 /* RISC processor for Lattice FPGA architecture */ +#define ELF_EM_SE_C17 139 /* Seiko Epson C17 family */ + +#define ELF_EM_MMDSP_PLUS 160 /* STMicroelectronics 64bit VLIW Data Signal Processor */ +#define ELF_EM_CYPRESS_M8C 161 /* Cypress M8C microprocessor */ +#define ELF_EM_R32C 162 /* Renesas R32C series microprocessors */ +#define ELF_EM_TRIMEDIA 163 /* NXP Semiconductors TriMedia architecture family */ +#define ELF_EM_QDSP6 164 /* QUALCOMM DSP6 Processor */ +#define ELF_EM_8051 165 /* Intel 8051 and variants */ +#define ELF_EM_STXP7X 166 /* STMicroelectronics STxP7x family */ +#define ELF_EM_NDS32 167 /* Andes Technology compact code size embedded RISC processor family */ +#define ELF_EM_ECOG1 168 /* Cyan Technology eCOG1X family */ +#define ELF_EM_ECOG1X 168 /* Cyan Technology eCOG1X family */ +#define ELF_EM_MAXQ30 169 /* Dallas Semiconductor MAXQ30 Core Micro-controllers */ +#define ELF_EM_XIMO16 170 /* New Japan Radio (NJR) 16-bit DSP Processor */ +#define ELF_EM_MANIK 171 /* M2000 Reconfigurable RISC Microprocessor */ +#define ELF_EM_CRAYNV2 172 /* Cray Inc. NV2 vector architecture */ +#define ELF_EM_RX 173 /* Renesas RX family */ +#define ELF_EM_METAG 174 /* Imagination Technologies META processor architecture */ +#define ELF_EM_MCST_ELBRUS 175 /* MCST Elbrus general purpose hardware architecture */ +#define ELF_EM_ECOG16 176 /* Cyan Technology eCOG16 family */ -#define ELF_EM_PJ 99 /* picoJava */ /* e_version */ #define ELF_EV_NONE 0 diff --git a/htanaly.cc b/htanaly.cc index 69a2db6..a3174e9 100644 --- a/htanaly.cc +++ b/htanaly.cc @@ -1269,7 +1269,7 @@ void ht_aviewer::handlemsg(htmsg *msg) } case cmd_analyser_name_addr: { if (!analy) break; - Address *addr; + Address *addr = NULL; if (!getCurrentAddress(&addr) || !canCreateAddress(addr, true)) { delete addr; clearmsg(msg); @@ -1971,7 +1971,6 @@ bool ht_aviewer::symbol_handler(eval_scalar *result, char *name) delete w; return true; } else { - delete w; return false; } } diff --git a/htelfhd.cc b/htelfhd.cc index 58417ba..a61e7a3 100644 --- a/htelfhd.cc +++ b/htelfhd.cc @@ -170,7 +170,9 @@ static int_hash elf_machine[] = {ELF_EM_ST100, "STMicroelectronics ST100 processor"}, {ELF_EM_TINYJ, "Advanced Logic Corp. TinyJ embedded processor"}, {ELF_EM_X86_64, "x86-64 (AMD Opteron)"}, - + {ELF_EM_PDSP, "Sony DSP Processor"}, + {ELF_EM_PDP10, "Digital Equipment Corp. PDP-10"}, + {ELF_EM_PDP11, "Digital Equipment Corp. PDP-11"}, {ELF_EM_FX66, "Siemens FX66 microcontroller"}, {ELF_EM_ST9PLUS, "STMicroelectronics ST9+ 8/16 bit microcontroller"}, {ELF_EM_ST7, "STMicroelectronics ST7 8-bit microcontroller"}, @@ -182,7 +184,11 @@ static int_hash elf_machine[] = {ELF_EM_ST19, "STMicroelectronics ST19 8-bit microcontroller"}, {ELF_EM_VAX, "Digital VAX"}, + {ELF_EM_AVR, "Atmel AVR 8-bit microcontroller"}, + {ELF_EM_PJ, "picoJava"}, + + {ELF_EM_C166, "Infineon C16x/XC16x processor"}, {0, 0} }; diff --git a/minilzo/README.LZO b/minilzo/README.LZO index fd1ea8a..3700f28 100644 --- a/minilzo/README.LZO +++ b/minilzo/README.LZO @@ -1,6 +1,3 @@ ------BEGIN PGP SIGNED MESSAGE----- -Hash: SHA1 - ============================================================================ miniLZO -- mini subset of the LZO real-time data compression library @@ -9,8 +6,8 @@ Hash: SHA1 Author : Markus Franz Xaver Johannes Oberhumer http://www.oberhumer.com/opensource/lzo/ - Version : 1.08 - Date : 12-Jul-2002 + Version : 2.03 + Date : 30 Apr 2008 I've created miniLZO for projects where it is inconvenient to include (or require) the full LZO source code just because you @@ -21,17 +18,16 @@ Hash: SHA1 for situations where you want to use pre-compressed data files (which must have been compressed with LZO1X-999). - miniLZO consists of one C source file and two header files: + miniLZO consists of one C source file and three header files: minilzo.c - minilzo.h - lzoconf.h + minilzo.h, lzoconf.h, lzodefs.h To use miniLZO just copy these files into your source directory, add minilzo.c to your Makefile and #include minilzo.h from your program. Note: you also must distribute this file (`README.LZO') with your project. minilzo.o compiles to about 6 kB (using gcc or Visual C on a i386), and - the sources are about 14 kB when packed with zip - so there's no more + the sources are about 30 kB when packed with zip - so there's no more excuse that your application doesn't support data compression :-) For more information, documentation, example programs and other support @@ -96,12 +92,14 @@ Hash: SHA1 Checks for typedefs and structures AC_CHECK_TYPE(ptrdiff_t,long) AC_TYPE_SIZE_T - AC_CHECK_SIZEOF(unsigned short) - AC_CHECK_SIZEOF(unsigned) - AC_CHECK_SIZEOF(unsigned long) - AC_CHECK_SIZEOF(char *) - AC_CHECK_SIZEOF(ptrdiff_t) + AC_CHECK_SIZEOF(short) + AC_CHECK_SIZEOF(int) + AC_CHECK_SIZEOF(long) + AC_CHECK_SIZEOF(long long) + AC_CHECK_SIZEOF(__int64) + AC_CHECK_SIZEOF(void *) AC_CHECK_SIZEOF(size_t) + AC_CHECK_SIZEOF(ptrdiff_t) Checks for compiler characteristics AC_C_CONST @@ -112,8 +110,8 @@ Hash: SHA1 Appendix D: Copyright --------------------- - LZO and miniLZO are Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 - Markus Franz Xaver Johannes Oberhumer + LZO and miniLZO are Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, + 2003, 2004, 2005, 2006, 2007, 2008 Markus Franz Xaver Johannes Oberhumer LZO and miniLZO are distributed under the terms of the GNU General Public License (GPL). See the file COPYING. @@ -123,11 +121,3 @@ Hash: SHA1 are available by contacting the author. - ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.0.7 (GNU/Linux) - -iD8DBQE9LPb4TWFXqwsgQ8kRAi/wAKCZ9Iej+voGhmKATaViOPS9chxGUwCgh5Dk -uwMS2PQ7BXHT0vf4yz+3tTc= -=PsNp ------END PGP SIGNATURE----- diff --git a/minilzo/lzoconf.h b/minilzo/lzoconf.h index 7a745ad..cc437f1 100644 --- a/minilzo/lzoconf.h +++ b/minilzo/lzoconf.h @@ -2,6 +2,9 @@ This file is part of the LZO real-time data compression library. + Copyright (C) 2008 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2007 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2006 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2005 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2004 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2003 Markus Franz Xaver Johannes Oberhumer @@ -15,8 +18,9 @@ All Rights Reserved. The LZO library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License, - version 2, as published by the Free Software Foundation. + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. The LZO library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -37,9 +41,9 @@ #ifndef __LZOCONF_H_INCLUDED #define __LZOCONF_H_INCLUDED -#define LZO_VERSION 0x2020 -#define LZO_VERSION_STRING "2.02" -#define LZO_VERSION_DATE "Oct 17 2005" +#define LZO_VERSION 0x2030 +#define LZO_VERSION_STRING "2.03" +#define LZO_VERSION_DATE "Apr 30 2008" /* internal Autoconf configuration file - only used when building LZO */ #if defined(LZO_HAVE_CONFIG_H) diff --git a/minilzo/lzodefs.h b/minilzo/lzodefs.h index 59d18a7..1805637 100644 --- a/minilzo/lzodefs.h +++ b/minilzo/lzodefs.h @@ -2,6 +2,9 @@ This file is part of the LZO real-time data compression library. + Copyright (C) 2008 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2007 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2006 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2005 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2004 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2003 Markus Franz Xaver Johannes Oberhumer @@ -15,8 +18,9 @@ All Rights Reserved. The LZO library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License, - version 2, as published by the Free Software Foundation. + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. The LZO library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -221,6 +225,20 @@ #if defined(__WATCOMC__) && (__WATCOMC__ < 900) # define LZO_BROKEN_INTEGRAL_CONSTANTS 1 #endif +#if defined(_CRAY) && defined(_CRAY1) +# define LZO_BROKEN_SIGNED_RIGHT_SHIFT 1 +#endif +#define LZO_PP_STRINGIZE(x) #x +#define LZO_PP_MACRO_EXPAND(x) LZO_PP_STRINGIZE(x) +#define LZO_PP_CONCAT2(a,b) a ## b +#define LZO_PP_CONCAT3(a,b,c) a ## b ## c +#define LZO_PP_CONCAT4(a,b,c,d) a ## b ## c ## d +#define LZO_PP_CONCAT5(a,b,c,d,e) a ## b ## c ## d ## e +#define LZO_PP_ECONCAT2(a,b) LZO_PP_CONCAT2(a,b) +#define LZO_PP_ECONCAT3(a,b,c) LZO_PP_CONCAT3(a,b,c) +#define LZO_PP_ECONCAT4(a,b,c,d) LZO_PP_CONCAT4(a,b,c,d) +#define LZO_PP_ECONCAT5(a,b,c,d,e) LZO_PP_CONCAT5(a,b,c,d,e) +#if 1 #define LZO_CPP_STRINGIZE(x) #x #define LZO_CPP_MACRO_EXPAND(x) LZO_CPP_STRINGIZE(x) #define LZO_CPP_CONCAT2(a,b) a ## b @@ -231,6 +249,7 @@ #define LZO_CPP_ECONCAT3(a,b,c) LZO_CPP_CONCAT3(a,b,c) #define LZO_CPP_ECONCAT4(a,b,c,d) LZO_CPP_CONCAT4(a,b,c,d) #define LZO_CPP_ECONCAT5(a,b,c,d,e) LZO_CPP_CONCAT5(a,b,c,d,e) +#endif #define __LZO_MASK_GEN(o,b) (((((o) << ((b)-1)) - (o)) << 1) + (o)) #if 1 && defined(__cplusplus) # if !defined(__STDC_CONSTANT_MACROS) @@ -250,6 +269,9 @@ # define LZO_INFO_OS "freestanding" #elif defined(LZO_OS_EMBEDDED) # define LZO_INFO_OS "embedded" +#elif 1 && defined(__IAR_SYSTEMS_ICC__) +# define LZO_OS_EMBEDDED 1 +# define LZO_INFO_OS "embedded" #elif defined(__CYGWIN__) && defined(__GNUC__) # define LZO_OS_CYGWIN 1 # define LZO_INFO_OS "cygwin" @@ -323,6 +345,9 @@ # elif defined(__NT__) && (__WATCOMC__ < 1100) # define LZO_OS_WIN32 1 # define LZO_INFO_OS "win32" +# elif defined(__linux__) || defined(__LINUX__) +# define LZO_OS_POSIX 1 +# define LZO_INFO_OS "posix" # else # error "please specify a target using the -bt compiler option" # endif @@ -368,12 +393,15 @@ # elif defined(__IRIX__) || defined(__irix__) # define LZO_OS_POSIX_IRIX 1 # define LZO_INFO_OS_POSIX "irix" -# elif defined(__linux__) || defined(__linux) +# elif defined(__linux__) || defined(__linux) || defined(__LINUX__) # define LZO_OS_POSIX_LINUX 1 # define LZO_INFO_OS_POSIX "linux" # elif defined(__APPLE__) || defined(__MACOS__) # define LZO_OS_POSIX_MACOSX 1 # define LZO_INFO_OS_POSIX "macosx" +# elif defined(__minix__) || defined(__minix) +# define LZO_OS_POSIX_MINIX 1 +# define LZO_INFO_OS_POSIX "minix" # elif defined(__NetBSD__) # define LZO_OS_POSIX_NETBSD 1 # define LZO_INFO_OS_POSIX "netbsd" @@ -394,6 +422,9 @@ # elif defined(__ultrix__) || defined(__ultrix) # define LZO_OS_POSIX_ULTRIX 1 # define LZO_INFO_OS_POSIX "ultrix" +# elif defined(_UNICOS) +# define LZO_OS_POSIX_UNICOS 1 +# define LZO_INFO_OS_POSIX "unicos" # else # define LZO_OS_POSIX_UNKNOWN 1 # define LZO_INFO_OS_POSIX "unknown" @@ -420,14 +451,14 @@ # define LZO_CC_CILLY 1 # define LZO_INFO_CC "Cilly" # if defined(__CILLY__) -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__CILLY__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__CILLY__) # else # define LZO_INFO_CCVER "unknown" # endif #elif 0 && defined(SDCC) && defined(__VERSION__) && !defined(__GNUC__) # define LZO_CC_SDCC 1 # define LZO_INFO_CC "sdcc" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(SDCC) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(SDCC) #elif defined(__PATHSCALE__) && defined(__PATHCC_PATCHLEVEL__) # define LZO_CC_PATHSCALE (__PATHCC__ * 0x10000L + __PATHCC_MINOR__ * 0x100 + __PATHCC_PATCHLEVEL__) # define LZO_INFO_CC "Pathscale C" @@ -435,13 +466,22 @@ #elif defined(__INTEL_COMPILER) # define LZO_CC_INTELC 1 # define LZO_INFO_CC "Intel C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__INTEL_COMPILER) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__INTEL_COMPILER) +# if defined(_WIN32) || defined(_WIN64) +# define LZO_CC_SYNTAX_MSC 1 +# else +# define LZO_CC_SYNTAX_GNUC 1 +# endif #elif defined(__POCC__) && defined(_WIN32) # define LZO_CC_PELLESC 1 # define LZO_INFO_CC "Pelles C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__POCC__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__POCC__) #elif defined(__llvm__) && defined(__GNUC__) && defined(__VERSION__) -# define LZO_CC_LLVM 1 +# if defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) +# define LZO_CC_LLVM (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100 + __GNUC_PATCHLEVEL__) +# else +# define LZO_CC_LLVM (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100) +# endif # define LZO_INFO_CC "llvm-gcc" # define LZO_INFO_CCVER __VERSION__ #elif defined(__GNUC__) && defined(__VERSION__) @@ -454,34 +494,50 @@ # endif # define LZO_INFO_CC "gcc" # define LZO_INFO_CCVER __VERSION__ +#elif defined(__ACK__) && defined(_ACK) +# define LZO_CC_ACK 1 +# define LZO_INFO_CC "Amsterdam Compiler Kit C" +# define LZO_INFO_CCVER "unknown" #elif defined(__AZTEC_C__) # define LZO_CC_AZTECC 1 # define LZO_INFO_CC "Aztec C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__AZTEC_C__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__AZTEC_C__) #elif defined(__BORLANDC__) # define LZO_CC_BORLANDC 1 # define LZO_INFO_CC "Borland C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__BORLANDC__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__BORLANDC__) +#elif defined(_CRAYC) && defined(_RELEASE) +# define LZO_CC_CRAYC 1 +# define LZO_INFO_CC "Cray C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(_RELEASE) #elif defined(__DMC__) && defined(__SC__) # define LZO_CC_DMC 1 # define LZO_INFO_CC "Digital Mars C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__DMC__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__DMC__) #elif defined(__DECC) # define LZO_CC_DECC 1 # define LZO_INFO_CC "DEC C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__DECC) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__DECC) #elif defined(__HIGHC__) # define LZO_CC_HIGHC 1 # define LZO_INFO_CC "MetaWare High C" # define LZO_INFO_CCVER "unknown" +#elif defined(__IAR_SYSTEMS_ICC__) +# define LZO_CC_IARC 1 +# define LZO_INFO_CC "IAR C" +# if defined(__VER__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__VER__) +# else +# define LZO_INFO_CCVER "unknown" +# endif #elif defined(__IBMC__) # define LZO_CC_IBMC 1 # define LZO_INFO_CC "IBM C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__IBMC__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__IBMC__) #elif defined(__KEIL__) && defined(__C166__) # define LZO_CC_KEILC 1 # define LZO_INFO_CC "Keil C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__C166__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__C166__) #elif defined(__LCC__) && defined(_WIN32) && defined(__LCCOPTIMLEVEL) # define LZO_CC_LCCWIN32 1 # define LZO_INFO_CC "lcc-win32" @@ -490,7 +546,7 @@ # define LZO_CC_LCC 1 # define LZO_INFO_CC "lcc" # if defined(__LCC_VERSION__) -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__LCC_VERSION__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__LCC_VERSION__) # else # define LZO_INFO_CCVER "unknown" # endif @@ -498,14 +554,14 @@ # define LZO_CC_MSC 1 # define LZO_INFO_CC "Microsoft C" # if defined(_MSC_FULL_VER) -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(_MSC_VER) "." LZO_CPP_MACRO_EXPAND(_MSC_FULL_VER) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(_MSC_VER) "." LZO_PP_MACRO_EXPAND(_MSC_FULL_VER) # else -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(_MSC_VER) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(_MSC_VER) # endif #elif defined(__MWERKS__) # define LZO_CC_MWERKS 1 # define LZO_INFO_CC "Metrowerks C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__MWERKS__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__MWERKS__) #elif (defined(__NDPC__) || defined(__NDPX__)) && defined(__i386) # define LZO_CC_NDPC 1 # define LZO_INFO_CC "Microway NDP C" @@ -513,7 +569,7 @@ #elif defined(__PACIFIC__) # define LZO_CC_PACIFICC 1 # define LZO_INFO_CC "Pacific C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__PACIFIC__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__PACIFIC__) #elif defined(__PGI) && (defined(__linux__) || defined(__WIN32__)) # define LZO_CC_PGI 1 # define LZO_INFO_CC "Portland Group PGI C" @@ -521,38 +577,52 @@ #elif defined(__PUREC__) && defined(__TOS__) # define LZO_CC_PUREC 1 # define LZO_INFO_CC "Pure C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__PUREC__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__PUREC__) #elif defined(__SC__) && defined(__ZTC__) # define LZO_CC_SYMANTECC 1 # define LZO_INFO_CC "Symantec C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__SC__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__SC__) #elif defined(__SUNPRO_C) -# define LZO_CC_SUNPROC 1 -# define LZO_INFO_CC "Sun C" -# define LZO_INFO_CCVER "unknown" +# define LZO_INFO_CC "SunPro C" +# if ((__SUNPRO_C)+0 > 0) +# define LZO_CC_SUNPROC __SUNPRO_C +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__SUNPRO_C) +# else +# define LZO_CC_SUNPROC 1 +# define LZO_INFO_CCVER "unknown" +# endif +#elif defined(__SUNPRO_CC) +# define LZO_INFO_CC "SunPro C" +# if ((__SUNPRO_CC)+0 > 0) +# define LZO_CC_SUNPROC __SUNPRO_CC +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__SUNPRO_CC) +# else +# define LZO_CC_SUNPROC 1 +# define LZO_INFO_CCVER "unknown" +# endif #elif defined(__TINYC__) # define LZO_CC_TINYC 1 # define LZO_INFO_CC "Tiny C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__TINYC__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__TINYC__) #elif defined(__TSC__) # define LZO_CC_TOPSPEEDC 1 # define LZO_INFO_CC "TopSpeed C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__TSC__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__TSC__) #elif defined(__WATCOMC__) # define LZO_CC_WATCOMC 1 # define LZO_INFO_CC "Watcom C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__WATCOMC__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__WATCOMC__) #elif defined(__TURBOC__) # define LZO_CC_TURBOC 1 # define LZO_INFO_CC "Turbo C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__TURBOC__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__TURBOC__) #elif defined(__ZTC__) # define LZO_CC_ZORTECHC 1 # define LZO_INFO_CC "Zortech C" # if (__ZTC__ == 0x310) # define LZO_INFO_CCVER "0x310" # else -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__ZTC__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__ZTC__) # endif #else # define LZO_CC_UNKNOWN 1 @@ -562,6 +632,15 @@ #if 0 && (LZO_CC_MSC && (_MSC_VER >= 1200)) && !defined(_MSC_FULL_VER) # error "LZO_CC_MSC: _MSC_FULL_VER is not defined" #endif +#if !defined(__LZO_ARCH_OVERRIDE) && !defined(LZO_ARCH_GENERIC) && defined(_CRAY) +# if (UINT_MAX > LZO_0xffffffffL) && defined(_CRAY) +# if defined(_CRAYMPP) || defined(_CRAYT3D) || defined(_CRAYT3E) +# define LZO_ARCH_CRAY_MPP 1 +# elif defined(_CRAY1) +# define LZO_ARCH_CRAY_PVP 1 +# endif +# endif +#endif #if !defined(__LZO_ARCH_OVERRIDE) #if defined(LZO_ARCH_GENERIC) # define LZO_INFO_ARCH "generic" @@ -572,6 +651,9 @@ #elif defined(__alpha__) || defined(__alpha) || defined(_M_ALPHA) # define LZO_ARCH_ALPHA 1 # define LZO_INFO_ARCH "alpha" +#elif (LZO_ARCH_CRAY_MPP) && (defined(_CRAYT3D) || defined(_CRAYT3E)) +# define LZO_ARCH_ALPHA 1 +# define LZO_INFO_ARCH "alpha" #elif defined(__amd64__) || defined(__x86_64__) || defined(_M_AMD64) # define LZO_ARCH_AMD64 1 # define LZO_INFO_ARCH "amd64" @@ -579,6 +661,16 @@ # define LZO_ARCH_ARM 1 # define LZO_ARCH_ARM_THUMB 1 # define LZO_INFO_ARCH "arm_thumb" +#elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICCARM__) +# define LZO_ARCH_ARM 1 +# if defined(__CPU_MODE__) && ((__CPU_MODE__)+0 == 1) +# define LZO_ARCH_ARM_THUMB 1 +# define LZO_INFO_ARCH "arm_thumb" +# elif defined(__CPU_MODE__) && ((__CPU_MODE__)+0 == 2) +# define LZO_INFO_ARCH "arm" +# else +# define LZO_INFO_ARCH "arm" +# endif #elif defined(__arm__) || defined(_M_ARM) # define LZO_ARCH_ARM 1 # define LZO_INFO_ARCH "arm" @@ -594,6 +686,9 @@ #elif defined(__cris__) # define LZO_ARCH_CRIS 1 # define LZO_INFO_ARCH "cris" +#elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICCEZ80__) +# define LZO_ARCH_EZ80 1 +# define LZO_INFO_ARCH "ez80" #elif defined(__H8300__) || defined(__H8300H__) || defined(__H8300S__) || defined(__H8300SX__) # define LZO_ARCH_H8300 1 # define LZO_INFO_ARCH "h8300" @@ -618,10 +713,13 @@ #elif (UINT_MAX == LZO_0xffffL) && defined(__m32c__) # define LZO_ARCH_M16C 1 # define LZO_INFO_ARCH "m16c" +#elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICCM16C__) +# define LZO_ARCH_M16C 1 +# define LZO_INFO_ARCH "m16c" #elif defined(__m32r__) # define LZO_ARCH_M32R 1 # define LZO_INFO_ARCH "m32r" -#elif (LZO_OS_TOS) || defined(__m68k__) || defined(__m68000__) || defined(__mc68000__) || defined(_M_M68K) +#elif (LZO_OS_TOS) || defined(__m68k__) || defined(__m68000__) || defined(__mc68000__) || defined(__mc68020__) || defined(_M_M68K) # define LZO_ARCH_M68K 1 # define LZO_INFO_ARCH "m68k" #elif (UINT_MAX == LZO_0xffffL) && defined(__C251__) @@ -630,13 +728,19 @@ #elif (UINT_MAX == LZO_0xffffL) && defined(__C51__) # define LZO_ARCH_MCS51 1 # define LZO_INFO_ARCH "mcs51" +#elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICC8051__) +# define LZO_ARCH_MCS51 1 +# define LZO_INFO_ARCH "mcs51" #elif defined(__mips__) || defined(__mips) || defined(_MIPS_ARCH) || defined(_M_MRX000) # define LZO_ARCH_MIPS 1 # define LZO_INFO_ARCH "mips" #elif (UINT_MAX == LZO_0xffffL) && defined(__MSP430__) # define LZO_ARCH_MSP430 1 # define LZO_INFO_ARCH "msp430" -#elif defined(__powerpc__) || defined(__powerpc) || defined(__ppc__) || defined(__PPC__) || defined(_M_PPC) +#elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICC430__) +# define LZO_ARCH_MSP430 1 +# define LZO_INFO_ARCH "msp430" +#elif defined(__powerpc__) || defined(__powerpc) || defined(__ppc__) || defined(__PPC__) || defined(_M_PPC) || defined(_ARCH_PPC) || defined(_ARCH_PWR) # define LZO_ARCH_POWERPC 1 # define LZO_INFO_ARCH "powerpc" #elif defined(__s390__) || defined(__s390) || defined(__s390x__) || defined(__s390x) @@ -648,9 +752,26 @@ #elif defined(__sparc__) || defined(__sparc) || defined(__sparcv8) # define LZO_ARCH_SPARC 1 # define LZO_INFO_ARCH "sparc" +#elif defined(__SPU__) +# define LZO_ARCH_SPU 1 +# define LZO_INFO_ARCH "spu" #elif (UINT_MAX == LZO_0xffffL) && defined(__z80) # define LZO_ARCH_Z80 1 # define LZO_INFO_ARCH "z80" +#elif (LZO_ARCH_CRAY_PVP) +# if defined(_CRAYSV1) +# define LZO_ARCH_CRAY_SV1 1 +# define LZO_INFO_ARCH "cray_sv1" +# elif (_ADDR64) +# define LZO_ARCH_CRAY_T90 1 +# define LZO_INFO_ARCH "cray_t90" +# elif (_ADDR32) +# define LZO_ARCH_CRAY_YMP 1 +# define LZO_INFO_ARCH "cray_ymp" +# else +# define LZO_ARCH_CRAY_XMP 1 +# define LZO_INFO_ARCH "cray_xmp" +# endif #else # define LZO_ARCH_UNKNOWN 1 # define LZO_INFO_ARCH "unknown" @@ -704,7 +825,7 @@ # endif #endif #if !defined(__LZO_MM_OVERRIDE) -#if (LZO_OS_DOS16 || LZO_OS_OS216 || LZO_OS_WIN16) +#if (LZO_ARCH_I086) #if (UINT_MAX != LZO_0xffffL) # error "this should not happen" #endif @@ -735,6 +856,7 @@ #else # error "unknown memory model" #endif +#if (LZO_OS_DOS16 || LZO_OS_OS216 || LZO_OS_WIN16) #define LZO_HAVE_MM_HUGE_PTR 1 #define LZO_HAVE_MM_HUGE_ARRAY 1 #if (LZO_MM_TINY) @@ -787,6 +909,7 @@ extern "C" { #ifdef __cplusplus } #endif +#endif #elif (LZO_ARCH_C166) #if !defined(__MODEL__) # error "FIXME - C166 __MODEL__" @@ -837,23 +960,27 @@ extern "C" { #else # error "FIXME - MCS51 __MODEL__" #endif +#elif (LZO_ARCH_CRAY_PVP) +# define LZO_MM_PVP 1 #else # define LZO_MM_FLAT 1 #endif -#if (LZO_MM_FLAT) -# define LZO_INFO_MM "flat" -#elif (LZO_MM_TINY) -# define LZO_INFO_MM "tiny" -#elif (LZO_MM_SMALL) -# define LZO_INFO_MM "small" -#elif (LZO_MM_MEDIUM) -# define LZO_INFO_MM "medium" -#elif (LZO_MM_COMPACT) +#if (LZO_MM_COMPACT) # define LZO_INFO_MM "compact" -#elif (LZO_MM_LARGE) -# define LZO_INFO_MM "large" +#elif (LZO_MM_FLAT) +# define LZO_INFO_MM "flat" #elif (LZO_MM_HUGE) # define LZO_INFO_MM "huge" +#elif (LZO_MM_LARGE) +# define LZO_INFO_MM "large" +#elif (LZO_MM_MEDIUM) +# define LZO_INFO_MM "medium" +#elif (LZO_MM_PVP) +# define LZO_INFO_MM "pvp" +#elif (LZO_MM_SMALL) +# define LZO_INFO_MM "small" +#elif (LZO_MM_TINY) +# define LZO_INFO_MM "tiny" #else # error "unknown memory model" #endif @@ -890,7 +1017,9 @@ extern "C" { #endif #define __LZO_LSR(x,b) (((x)+0ul) >> (b)) #if !defined(LZO_SIZEOF_SHORT) -# if (USHRT_MAX == LZO_0xffffL) +# if (LZO_ARCH_CRAY_PVP) +# define LZO_SIZEOF_SHORT 8 +# elif (USHRT_MAX == LZO_0xffffL) # define LZO_SIZEOF_SHORT 2 # elif (__LZO_LSR(USHRT_MAX,7) == 1) # define LZO_SIZEOF_SHORT 1 @@ -907,7 +1036,9 @@ extern "C" { # endif #endif #if !defined(LZO_SIZEOF_INT) -# if (UINT_MAX == LZO_0xffffL) +# if (LZO_ARCH_CRAY_PVP) +# define LZO_SIZEOF_INT 8 +# elif (UINT_MAX == LZO_0xffffL) # define LZO_SIZEOF_INT 2 # elif (UINT_MAX == LZO_0xffffffffL) # define LZO_SIZEOF_INT 4 @@ -948,6 +1079,8 @@ extern "C" { # if (LZO_CC_GNUC >= 0x030300ul) # if ((__LONG_MAX__)+0 == (__LONG_LONG_MAX__)+0) # define LZO_SIZEOF_LONG_LONG LZO_SIZEOF_LONG +# elif (__LZO_LSR(__LONG_LONG_MAX__,30) == 1) +# define LZO_SIZEOF_LONG_LONG 4 # endif # endif # endif @@ -960,9 +1093,9 @@ extern "C" { # define LZO_SIZEOF_LONG_LONG 8 #elif (LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE) # define LZO_SIZEOF_LONG_LONG 8 -#elif ((LZO_OS_WIN32 || LZO_OS_WIN64) && LZO_CC_MSC && (_MSC_VER >= 1400)) +#elif ((LZO_OS_WIN32 || LZO_OS_WIN64 || defined(_WIN32)) && LZO_CC_MSC && (_MSC_VER >= 1400)) # define LZO_SIZEOF_LONG_LONG 8 -#elif (LZO_OS_WIN64) +#elif (LZO_OS_WIN64 || defined(_WIN64)) # define LZO_SIZEOF___INT64 8 #elif (LZO_ARCH_I386 && (LZO_CC_DMC)) # define LZO_SIZEOF_LONG_LONG 8 @@ -970,11 +1103,11 @@ extern "C" { # define LZO_SIZEOF_LONG_LONG 8 #elif (LZO_ARCH_I386 && (LZO_CC_INTELC && defined(__linux__))) # define LZO_SIZEOF_LONG_LONG 8 -#elif (LZO_ARCH_I386 && (LZO_CC_MWERKS || LZO_CC_PELLESC || LZO_CC_PGI)) +#elif (LZO_ARCH_I386 && (LZO_CC_MWERKS || LZO_CC_PELLESC || LZO_CC_PGI || LZO_CC_SUNPROC)) # define LZO_SIZEOF_LONG_LONG 8 #elif (LZO_ARCH_I386 && (LZO_CC_INTELC || LZO_CC_MSC)) # define LZO_SIZEOF___INT64 8 -#elif (LZO_OS_WIN32 && (LZO_CC_MSC)) +#elif ((LZO_OS_WIN32 || defined(_WIN32)) && (LZO_CC_MSC)) # define LZO_SIZEOF___INT64 8 #elif (LZO_ARCH_I386 && (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0520))) # define LZO_SIZEOF___INT64 8 @@ -982,7 +1115,7 @@ extern "C" { # define LZO_SIZEOF___INT64 8 #elif (LZO_CC_WATCOMC && defined(_INTEGRAL_MAX_BITS) && (_INTEGRAL_MAX_BITS == 64)) # define LZO_SIZEOF___INT64 8 -#elif (LZO_OS_OS400) && defined(__LLP64_IFC__) +#elif (LZO_OS_OS400 || defined(__OS400__)) && defined(__LLP64_IFC__) # define LZO_SIZEOF_LONG_LONG 8 #elif (defined(__vms) || defined(__VMS)) && (__INITIAL_POINTER_SIZE+0 == 64) # define LZO_SIZEOF_LONG_LONG 8 @@ -1043,11 +1176,11 @@ extern "C" { #elif defined(__LLP64__) || defined(__LLP64) || defined(_LLP64) || defined(_WIN64) # define __LZO_WORDSIZE 8 # define LZO_SIZEOF_VOID_P 8 -#elif (LZO_OS_OS400) && defined(__LLP64_IFC__) +#elif (LZO_OS_OS400 || defined(__OS400__)) && defined(__LLP64_IFC__) # define LZO_SIZEOF_VOID_P LZO_SIZEOF_LONG # define LZO_SIZEOF_SIZE_T LZO_SIZEOF_LONG # define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_LONG -#elif (LZO_OS_OS400) +#elif (LZO_OS_OS400 || defined(__OS400__)) # define __LZO_WORDSIZE LZO_SIZEOF_LONG # define LZO_SIZEOF_VOID_P 16 # define LZO_SIZEOF_SIZE_T LZO_SIZEOF_LONG @@ -1056,6 +1189,11 @@ extern "C" { # define LZO_SIZEOF_VOID_P 8 # define LZO_SIZEOF_SIZE_T LZO_SIZEOF_LONG # define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_LONG +#elif (LZO_ARCH_SPU) +# if 0 +# define __LZO_WORDSIZE 16 +# endif +# define LZO_SIZEOF_VOID_P 4 #else # define LZO_SIZEOF_VOID_P LZO_SIZEOF_LONG #endif @@ -1091,15 +1229,30 @@ extern "C" { # define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_SIZE_T #endif #endif -#if !defined(LZO_ABI_BIG_ENDIAN) && !defined(LZO_ABI_LITTLE_ENDIAN) && !defined(LZO_ABI_NEUTRAL_ENDIAN) -#if (LZO_ARCH_AMD64 || LZO_ARCH_CRIS || LZO_ARCH_I086 || LZO_ARCH_I386 || LZO_ARCH_MSP430) +#if defined(LZO_ABI_NEUTRAL_ENDIAN) +# undef LZO_ABI_BIG_ENDIAN +# undef LZO_ABI_LITTLE_ENDIAN +#elif !defined(LZO_ABI_BIG_ENDIAN) && !defined(LZO_ABI_LITTLE_ENDIAN) +#if (LZO_ARCH_ALPHA) && (LZO_ARCH_CRAY_MPP) +# define LZO_ABI_BIG_ENDIAN 1 +#elif (LZO_ARCH_ALPHA || LZO_ARCH_AMD64 || LZO_ARCH_BLACKFIN || LZO_ARCH_CRIS || LZO_ARCH_I086 || LZO_ARCH_I386 || LZO_ARCH_MSP430) # define LZO_ABI_LITTLE_ENDIAN 1 #elif (LZO_ARCH_M68K || LZO_ARCH_S390) # define LZO_ABI_BIG_ENDIAN 1 +#elif 1 && defined(__IAR_SYSTEMS_ICC__) && defined(__LITTLE_ENDIAN__) +# if (__LITTLE_ENDIAN__ == 1) +# define LZO_ABI_LITTLE_ENDIAN 1 +# else +# define LZO_ABI_BIG_ENDIAN 1 +# endif #elif 1 && defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__) # define LZO_ABI_BIG_ENDIAN 1 #elif 1 && defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__) # define LZO_ABI_LITTLE_ENDIAN 1 +#elif 1 && (LZO_ARCH_ARM) && defined(__ARMEB__) && !defined(__ARMEL__) +# define LZO_ABI_BIG_ENDIAN 1 +#elif 1 && (LZO_ARCH_ARM) && defined(__ARMEL__) && !defined(__ARMEB__) +# define LZO_ABI_LITTLE_ENDIAN 1 #elif 1 && (LZO_ARCH_MIPS) && defined(__MIPSEB__) && !defined(__MIPSEL__) # define LZO_ABI_BIG_ENDIAN 1 #elif 1 && (LZO_ARCH_MIPS) && defined(__MIPSEL__) && !defined(__MIPSEB__) @@ -1168,25 +1321,66 @@ extern "C" { #elif (LZO_CC_MWERKS) && defined(__MSL__) # define LZO_LIBC_MSL __MSL__ # define LZO_INFO_LIBC "msl" +#elif 1 && defined(__IAR_SYSTEMS_ICC__) +# define LZO_LIBC_ISOC90 1 +# define LZO_INFO_LIBC "isoc90" #else # define LZO_LIBC_DEFAULT 1 # define LZO_INFO_LIBC "default" #endif #endif +#if !defined(__lzo_gnuc_extension__) #if (LZO_CC_GNUC >= 0x020800ul) -# define __lzo_gnuc_extension__ __extension__ +# define __lzo_gnuc_extension__ __extension__ #elif (LZO_CC_LLVM || LZO_CC_PATHSCALE) -# define __lzo_gnuc_extension__ __extension__ +# define __lzo_gnuc_extension__ __extension__ #else # define __lzo_gnuc_extension__ #endif +#endif +#if !defined(__lzo_ua_volatile) +# define __lzo_ua_volatile volatile +#endif +#if !defined(__lzo_alignof) #if (LZO_CC_CILLY || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE || LZO_CC_PGI) -# define lzo_alignof(e) __alignof__(e) +# define __lzo_alignof(e) __alignof__(e) #elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 700)) -# define lzo_alignof(e) __alignof__(e) +# define __lzo_alignof(e) __alignof__(e) #elif (LZO_CC_MSC && (_MSC_VER >= 1300)) -# define lzo_alignof(e) __alignof(e) +# define __lzo_alignof(e) __alignof(e) +#endif +#endif +#if defined(__lzo_alignof) +# define __lzo_HAVE_alignof 1 +#endif +#if !defined(__lzo_constructor) +#if (LZO_CC_GNUC >= 0x030400ul) +# define __lzo_constructor __attribute__((__constructor__,__used__)) +#elif (LZO_CC_GNUC >= 0x020700ul) +# define __lzo_constructor __attribute__((__constructor__)) +#elif (LZO_CC_LLVM || LZO_CC_PATHSCALE) +# define __lzo_constructor __attribute__((__constructor__)) +#endif +#endif +#if defined(__lzo_constructor) +# define __lzo_HAVE_constructor 1 +#endif +#if !defined(__lzo_destructor) +#if (LZO_CC_GNUC >= 0x030400ul) +# define __lzo_destructor __attribute__((__destructor__,__used__)) +#elif (LZO_CC_GNUC >= 0x020700ul) +# define __lzo_destructor __attribute__((__destructor__)) +#elif (LZO_CC_LLVM || LZO_CC_PATHSCALE) +# define __lzo_destructor __attribute__((__destructor__)) +#endif +#endif +#if defined(__lzo_destructor) +# define __lzo_HAVE_destructor 1 #endif +#if defined(__lzo_HAVE_destructor) && !defined(__lzo_HAVE_constructor) +# error "this should not happen" +#endif +#if !defined(__lzo_inline) #if (LZO_CC_TURBOC && (__TURBOC__ <= 0x0295)) #elif defined(__cplusplus) # define __lzo_inline inline @@ -1205,22 +1399,38 @@ extern "C" { #elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) # define __lzo_inline inline #endif +#endif +#if defined(__lzo_inline) +# define __lzo_HAVE_inline 1 +#else +# define __lzo_inline +#endif +#if !defined(__lzo_forceinline) #if (LZO_CC_GNUC >= 0x030200ul) # define __lzo_forceinline __inline__ __attribute__((__always_inline__)) -#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 450) && (LZO_OS_WIN32 || LZO_OS_WIN64)) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 450) && LZO_CC_SYNTAX_MSC) # define __lzo_forceinline __forceinline -#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 800)) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 800) && LZO_CC_SYNTAX_GNUC) # define __lzo_forceinline __inline__ __attribute__((__always_inline__)) #elif (LZO_CC_LLVM || LZO_CC_PATHSCALE) # define __lzo_forceinline __inline__ __attribute__((__always_inline__)) #elif (LZO_CC_MSC && (_MSC_VER >= 1200)) # define __lzo_forceinline __forceinline #endif -#if (LZO_CC_GNUC >= 0x030200ul) +#endif +#if defined(__lzo_forceinline) +# define __lzo_HAVE_forceinline 1 +#else +# define __lzo_forceinline +#endif +#if !defined(__lzo_noinline) +#if 1 && (LZO_ARCH_I386) && (LZO_CC_GNUC >= 0x040000ul) && (LZO_CC_GNUC < 0x040003ul) +# define __lzo_noinline __attribute__((__noinline__,__used__)) +#elif (LZO_CC_GNUC >= 0x030200ul) # define __lzo_noinline __attribute__((__noinline__)) -#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 600) && (LZO_OS_WIN32 || LZO_OS_WIN64)) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 600) && LZO_CC_SYNTAX_MSC) # define __lzo_noinline __declspec(noinline) -#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 800)) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 800) && LZO_CC_SYNTAX_GNUC) # define __lzo_noinline __attribute__((__noinline__)) #elif (LZO_CC_LLVM || LZO_CC_PATHSCALE) # define __lzo_noinline __attribute__((__noinline__)) @@ -1232,37 +1442,68 @@ extern "C" { # define __lzo_noinline __declspec(noinline) # endif #endif -#if (defined(__lzo_forceinline) || defined(__lzo_noinline)) && !defined(__lzo_inline) +#endif +#if defined(__lzo_noinline) +# define __lzo_HAVE_noinline 1 +#else +# define __lzo_noinline +#endif +#if (defined(__lzo_HAVE_forceinline) || defined(__lzo_HAVE_noinline)) && !defined(__lzo_HAVE_inline) # error "this should not happen" #endif +#if !defined(__lzo_noreturn) #if (LZO_CC_GNUC >= 0x020700ul) # define __lzo_noreturn __attribute__((__noreturn__)) -#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 450) && (LZO_OS_WIN32 || LZO_OS_WIN64)) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 450) && LZO_CC_SYNTAX_MSC) # define __lzo_noreturn __declspec(noreturn) -#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 600) && (LZO_OS_POSIX)) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 600) && LZO_CC_SYNTAX_GNUC) # define __lzo_noreturn __attribute__((__noreturn__)) #elif (LZO_CC_LLVM || LZO_CC_PATHSCALE) # define __lzo_noreturn __attribute__((__noreturn__)) #elif (LZO_CC_MSC && (_MSC_VER >= 1200)) # define __lzo_noreturn __declspec(noreturn) #endif -#if (LZO_CC_GNUC >= 0x030400ul) -# define __lzo_constructor __attribute__((__constructor__,__used__)) -#elif (LZO_CC_GNUC >= 0x020700ul) -# define __lzo_constructor __attribute__((__constructor__)) +#endif +#if defined(__lzo_noreturn) +# define __lzo_HAVE_noreturn 1 +#else +# define __lzo_noreturn +#endif +#if !defined(__lzo_nothrow) +#if (LZO_CC_GNUC >= 0x030300ul) +# define __lzo_nothrow __attribute__((__nothrow__)) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 450) && LZO_CC_SYNTAX_MSC) && defined(__cplusplus) +# define __lzo_nothrow __declspec(nothrow) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 800) && LZO_CC_SYNTAX_GNUC) +# define __lzo_nothrow __attribute__((__nothrow__)) #elif (LZO_CC_LLVM || LZO_CC_PATHSCALE) -# define __lzo_constructor __attribute__((__constructor__)) +# define __lzo_nothrow __attribute__((__nothrow__)) +#elif (LZO_CC_MSC && (_MSC_VER >= 1200)) && defined(__cplusplus) +# define __lzo_nothrow __declspec(nothrow) +#endif +#endif +#if defined(__lzo_nothrow) +# define __lzo_HAVE_nothrow 1 +#else +# define __lzo_nothrow #endif +#if !defined(__lzo_restrict) #if (LZO_CC_GNUC >= 0x030400ul) -# define __lzo_destructor __attribute__((__destructor__,__used__)) -#elif (LZO_CC_GNUC >= 0x020700ul) -# define __lzo_destructor __attribute__((__destructor__)) -#elif (LZO_CC_LLVM || LZO_CC_PATHSCALE) -# define __lzo_destructor __attribute__((__destructor__)) +# define __lzo_restrict __restrict__ +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 600) && LZO_CC_SYNTAX_GNUC) +# define __lzo_restrict __restrict__ +#elif (LZO_CC_LLVM) +# define __lzo_restrict __restrict__ +#elif (LZO_CC_MSC && (_MSC_VER >= 1400)) +# define __lzo_restrict __restrict #endif -#if defined(__lzo_destructor) && !defined(__lzo_constructor) -# error "this should not happen" #endif +#if defined(__lzo_restrict) +# define __lzo_HAVE_restrict 1 +#else +# define __lzo_restrict +#endif +#if !defined(__lzo_likely) && !defined(__lzo_unlikely) #if (LZO_CC_GNUC >= 0x030200ul) # define __lzo_likely(e) (__builtin_expect(!!(e),1)) # define __lzo_unlikely(e) (__builtin_expect(!!(e),0)) @@ -1272,8 +1513,16 @@ extern "C" { #elif (LZO_CC_LLVM || LZO_CC_PATHSCALE) # define __lzo_likely(e) (__builtin_expect(!!(e),1)) # define __lzo_unlikely(e) (__builtin_expect(!!(e),0)) +#endif +#endif +#if defined(__lzo_likely) +# define __lzo_HAVE_likely 1 #else # define __lzo_likely(e) (e) +#endif +#if defined(__lzo_unlikely) +# define __lzo_HAVE_unlikely 1 +#else # define __lzo_unlikely(e) (e) #endif #if !defined(LZO_UNUSED) @@ -1321,6 +1570,15 @@ extern "C" { # define LZO_UNUSED_LABEL(l) switch(0) case 1:goto l # endif #endif +#if !defined(LZO_DEFINE_UNINITIALIZED_VAR) +# if 0 +# define LZO_DEFINE_UNINITIALIZED_VAR(type,var,init) type var +# elif 0 && (LZO_CC_GNUC) +# define LZO_DEFINE_UNINITIALIZED_VAR(type,var,init) type var = var +# else +# define LZO_DEFINE_UNINITIALIZED_VAR(type,var,init) type var = init +# endif +#endif #if !defined(LZO_COMPILE_TIME_ASSERT_HEADER) # if (LZO_CC_AZTECC || LZO_CC_ZORTECHC) # define LZO_COMPILE_TIME_ASSERT_HEADER(e) extern int __lzo_cta[1-!(e)]; @@ -1384,6 +1642,8 @@ extern "C" { # else # define __lzo_cdecl_sighandler __cdecl # endif +#elif (LZO_ARCH_I386) && (LZO_CC_WATCOMC) +# define __lzo_cdecl __cdecl #elif (LZO_ARCH_M68K && LZO_OS_TOS && (LZO_CC_PUREC || LZO_CC_TURBOC)) # define __lzo_cdecl cdecl #endif @@ -1405,6 +1665,7 @@ extern "C" { #if !defined(__lzo_cdecl_va) # define __lzo_cdecl_va __lzo_cdecl #endif +#if !defined(LZO_CFG_NO_WINDOWS_H) #if (LZO_OS_CYGWIN || (LZO_OS_EMX && defined(__RSXNT__)) || LZO_OS_WIN32 || LZO_OS_WIN64) # if (LZO_CC_WATCOMC && (__WATCOMC__ < 1000)) # elif (LZO_OS_WIN32 && LZO_CC_GNUC) && defined(__PW32__) @@ -1413,6 +1674,7 @@ extern "C" { # define LZO_HAVE_WINDOWS_H 1 # endif #endif +#endif #if (LZO_ARCH_ALPHA) # define LZO_OPT_AVOID_UINT_INDEX 1 # define LZO_OPT_AVOID_SHORT 1 diff --git a/minilzo/minilzo.c b/minilzo/minilzo.c index 76a0cae..de1ae9e 100644 --- a/minilzo/minilzo.c +++ b/minilzo/minilzo.c @@ -2,6 +2,9 @@ This file is part of the LZO real-time data compression library. + Copyright (C) 2008 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2007 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2006 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2005 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2004 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2003 Markus Franz Xaver Johannes Oberhumer @@ -15,8 +18,9 @@ All Rights Reserved. The LZO library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License, - version 2, as published by the Free Software Foundation. + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. The LZO library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -242,6 +246,20 @@ #if defined(__WATCOMC__) && (__WATCOMC__ < 900) # define LZO_BROKEN_INTEGRAL_CONSTANTS 1 #endif +#if defined(_CRAY) && defined(_CRAY1) +# define LZO_BROKEN_SIGNED_RIGHT_SHIFT 1 +#endif +#define LZO_PP_STRINGIZE(x) #x +#define LZO_PP_MACRO_EXPAND(x) LZO_PP_STRINGIZE(x) +#define LZO_PP_CONCAT2(a,b) a ## b +#define LZO_PP_CONCAT3(a,b,c) a ## b ## c +#define LZO_PP_CONCAT4(a,b,c,d) a ## b ## c ## d +#define LZO_PP_CONCAT5(a,b,c,d,e) a ## b ## c ## d ## e +#define LZO_PP_ECONCAT2(a,b) LZO_PP_CONCAT2(a,b) +#define LZO_PP_ECONCAT3(a,b,c) LZO_PP_CONCAT3(a,b,c) +#define LZO_PP_ECONCAT4(a,b,c,d) LZO_PP_CONCAT4(a,b,c,d) +#define LZO_PP_ECONCAT5(a,b,c,d,e) LZO_PP_CONCAT5(a,b,c,d,e) +#if 1 #define LZO_CPP_STRINGIZE(x) #x #define LZO_CPP_MACRO_EXPAND(x) LZO_CPP_STRINGIZE(x) #define LZO_CPP_CONCAT2(a,b) a ## b @@ -252,6 +270,7 @@ #define LZO_CPP_ECONCAT3(a,b,c) LZO_CPP_CONCAT3(a,b,c) #define LZO_CPP_ECONCAT4(a,b,c,d) LZO_CPP_CONCAT4(a,b,c,d) #define LZO_CPP_ECONCAT5(a,b,c,d,e) LZO_CPP_CONCAT5(a,b,c,d,e) +#endif #define __LZO_MASK_GEN(o,b) (((((o) << ((b)-1)) - (o)) << 1) + (o)) #if 1 && defined(__cplusplus) # if !defined(__STDC_CONSTANT_MACROS) @@ -271,6 +290,9 @@ # define LZO_INFO_OS "freestanding" #elif defined(LZO_OS_EMBEDDED) # define LZO_INFO_OS "embedded" +#elif 1 && defined(__IAR_SYSTEMS_ICC__) +# define LZO_OS_EMBEDDED 1 +# define LZO_INFO_OS "embedded" #elif defined(__CYGWIN__) && defined(__GNUC__) # define LZO_OS_CYGWIN 1 # define LZO_INFO_OS "cygwin" @@ -344,6 +366,9 @@ # elif defined(__NT__) && (__WATCOMC__ < 1100) # define LZO_OS_WIN32 1 # define LZO_INFO_OS "win32" +# elif defined(__linux__) || defined(__LINUX__) +# define LZO_OS_POSIX 1 +# define LZO_INFO_OS "posix" # else # error "please specify a target using the -bt compiler option" # endif @@ -389,12 +414,15 @@ # elif defined(__IRIX__) || defined(__irix__) # define LZO_OS_POSIX_IRIX 1 # define LZO_INFO_OS_POSIX "irix" -# elif defined(__linux__) || defined(__linux) +# elif defined(__linux__) || defined(__linux) || defined(__LINUX__) # define LZO_OS_POSIX_LINUX 1 # define LZO_INFO_OS_POSIX "linux" # elif defined(__APPLE__) || defined(__MACOS__) # define LZO_OS_POSIX_MACOSX 1 # define LZO_INFO_OS_POSIX "macosx" +# elif defined(__minix__) || defined(__minix) +# define LZO_OS_POSIX_MINIX 1 +# define LZO_INFO_OS_POSIX "minix" # elif defined(__NetBSD__) # define LZO_OS_POSIX_NETBSD 1 # define LZO_INFO_OS_POSIX "netbsd" @@ -415,6 +443,9 @@ # elif defined(__ultrix__) || defined(__ultrix) # define LZO_OS_POSIX_ULTRIX 1 # define LZO_INFO_OS_POSIX "ultrix" +# elif defined(_UNICOS) +# define LZO_OS_POSIX_UNICOS 1 +# define LZO_INFO_OS_POSIX "unicos" # else # define LZO_OS_POSIX_UNKNOWN 1 # define LZO_INFO_OS_POSIX "unknown" @@ -441,14 +472,14 @@ # define LZO_CC_CILLY 1 # define LZO_INFO_CC "Cilly" # if defined(__CILLY__) -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__CILLY__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__CILLY__) # else # define LZO_INFO_CCVER "unknown" # endif #elif 0 && defined(SDCC) && defined(__VERSION__) && !defined(__GNUC__) # define LZO_CC_SDCC 1 # define LZO_INFO_CC "sdcc" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(SDCC) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(SDCC) #elif defined(__PATHSCALE__) && defined(__PATHCC_PATCHLEVEL__) # define LZO_CC_PATHSCALE (__PATHCC__ * 0x10000L + __PATHCC_MINOR__ * 0x100 + __PATHCC_PATCHLEVEL__) # define LZO_INFO_CC "Pathscale C" @@ -456,13 +487,22 @@ #elif defined(__INTEL_COMPILER) # define LZO_CC_INTELC 1 # define LZO_INFO_CC "Intel C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__INTEL_COMPILER) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__INTEL_COMPILER) +# if defined(_WIN32) || defined(_WIN64) +# define LZO_CC_SYNTAX_MSC 1 +# else +# define LZO_CC_SYNTAX_GNUC 1 +# endif #elif defined(__POCC__) && defined(_WIN32) # define LZO_CC_PELLESC 1 # define LZO_INFO_CC "Pelles C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__POCC__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__POCC__) #elif defined(__llvm__) && defined(__GNUC__) && defined(__VERSION__) -# define LZO_CC_LLVM 1 +# if defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) +# define LZO_CC_LLVM (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100 + __GNUC_PATCHLEVEL__) +# else +# define LZO_CC_LLVM (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100) +# endif # define LZO_INFO_CC "llvm-gcc" # define LZO_INFO_CCVER __VERSION__ #elif defined(__GNUC__) && defined(__VERSION__) @@ -475,34 +515,50 @@ # endif # define LZO_INFO_CC "gcc" # define LZO_INFO_CCVER __VERSION__ +#elif defined(__ACK__) && defined(_ACK) +# define LZO_CC_ACK 1 +# define LZO_INFO_CC "Amsterdam Compiler Kit C" +# define LZO_INFO_CCVER "unknown" #elif defined(__AZTEC_C__) # define LZO_CC_AZTECC 1 # define LZO_INFO_CC "Aztec C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__AZTEC_C__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__AZTEC_C__) #elif defined(__BORLANDC__) # define LZO_CC_BORLANDC 1 # define LZO_INFO_CC "Borland C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__BORLANDC__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__BORLANDC__) +#elif defined(_CRAYC) && defined(_RELEASE) +# define LZO_CC_CRAYC 1 +# define LZO_INFO_CC "Cray C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(_RELEASE) #elif defined(__DMC__) && defined(__SC__) # define LZO_CC_DMC 1 # define LZO_INFO_CC "Digital Mars C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__DMC__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__DMC__) #elif defined(__DECC) # define LZO_CC_DECC 1 # define LZO_INFO_CC "DEC C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__DECC) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__DECC) #elif defined(__HIGHC__) # define LZO_CC_HIGHC 1 # define LZO_INFO_CC "MetaWare High C" # define LZO_INFO_CCVER "unknown" +#elif defined(__IAR_SYSTEMS_ICC__) +# define LZO_CC_IARC 1 +# define LZO_INFO_CC "IAR C" +# if defined(__VER__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__VER__) +# else +# define LZO_INFO_CCVER "unknown" +# endif #elif defined(__IBMC__) # define LZO_CC_IBMC 1 # define LZO_INFO_CC "IBM C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__IBMC__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__IBMC__) #elif defined(__KEIL__) && defined(__C166__) # define LZO_CC_KEILC 1 # define LZO_INFO_CC "Keil C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__C166__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__C166__) #elif defined(__LCC__) && defined(_WIN32) && defined(__LCCOPTIMLEVEL) # define LZO_CC_LCCWIN32 1 # define LZO_INFO_CC "lcc-win32" @@ -511,7 +567,7 @@ # define LZO_CC_LCC 1 # define LZO_INFO_CC "lcc" # if defined(__LCC_VERSION__) -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__LCC_VERSION__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__LCC_VERSION__) # else # define LZO_INFO_CCVER "unknown" # endif @@ -519,14 +575,14 @@ # define LZO_CC_MSC 1 # define LZO_INFO_CC "Microsoft C" # if defined(_MSC_FULL_VER) -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(_MSC_VER) "." LZO_CPP_MACRO_EXPAND(_MSC_FULL_VER) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(_MSC_VER) "." LZO_PP_MACRO_EXPAND(_MSC_FULL_VER) # else -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(_MSC_VER) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(_MSC_VER) # endif #elif defined(__MWERKS__) # define LZO_CC_MWERKS 1 # define LZO_INFO_CC "Metrowerks C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__MWERKS__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__MWERKS__) #elif (defined(__NDPC__) || defined(__NDPX__)) && defined(__i386) # define LZO_CC_NDPC 1 # define LZO_INFO_CC "Microway NDP C" @@ -534,7 +590,7 @@ #elif defined(__PACIFIC__) # define LZO_CC_PACIFICC 1 # define LZO_INFO_CC "Pacific C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__PACIFIC__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__PACIFIC__) #elif defined(__PGI) && (defined(__linux__) || defined(__WIN32__)) # define LZO_CC_PGI 1 # define LZO_INFO_CC "Portland Group PGI C" @@ -542,38 +598,52 @@ #elif defined(__PUREC__) && defined(__TOS__) # define LZO_CC_PUREC 1 # define LZO_INFO_CC "Pure C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__PUREC__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__PUREC__) #elif defined(__SC__) && defined(__ZTC__) # define LZO_CC_SYMANTECC 1 # define LZO_INFO_CC "Symantec C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__SC__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__SC__) #elif defined(__SUNPRO_C) -# define LZO_CC_SUNPROC 1 -# define LZO_INFO_CC "Sun C" -# define LZO_INFO_CCVER "unknown" +# define LZO_INFO_CC "SunPro C" +# if ((__SUNPRO_C)+0 > 0) +# define LZO_CC_SUNPROC __SUNPRO_C +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__SUNPRO_C) +# else +# define LZO_CC_SUNPROC 1 +# define LZO_INFO_CCVER "unknown" +# endif +#elif defined(__SUNPRO_CC) +# define LZO_INFO_CC "SunPro C" +# if ((__SUNPRO_CC)+0 > 0) +# define LZO_CC_SUNPROC __SUNPRO_CC +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__SUNPRO_CC) +# else +# define LZO_CC_SUNPROC 1 +# define LZO_INFO_CCVER "unknown" +# endif #elif defined(__TINYC__) # define LZO_CC_TINYC 1 # define LZO_INFO_CC "Tiny C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__TINYC__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__TINYC__) #elif defined(__TSC__) # define LZO_CC_TOPSPEEDC 1 # define LZO_INFO_CC "TopSpeed C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__TSC__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__TSC__) #elif defined(__WATCOMC__) # define LZO_CC_WATCOMC 1 # define LZO_INFO_CC "Watcom C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__WATCOMC__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__WATCOMC__) #elif defined(__TURBOC__) # define LZO_CC_TURBOC 1 # define LZO_INFO_CC "Turbo C" -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__TURBOC__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__TURBOC__) #elif defined(__ZTC__) # define LZO_CC_ZORTECHC 1 # define LZO_INFO_CC "Zortech C" # if (__ZTC__ == 0x310) # define LZO_INFO_CCVER "0x310" # else -# define LZO_INFO_CCVER LZO_CPP_MACRO_EXPAND(__ZTC__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__ZTC__) # endif #else # define LZO_CC_UNKNOWN 1 @@ -583,6 +653,15 @@ #if 0 && (LZO_CC_MSC && (_MSC_VER >= 1200)) && !defined(_MSC_FULL_VER) # error "LZO_CC_MSC: _MSC_FULL_VER is not defined" #endif +#if !defined(__LZO_ARCH_OVERRIDE) && !defined(LZO_ARCH_GENERIC) && defined(_CRAY) +# if (UINT_MAX > LZO_0xffffffffL) && defined(_CRAY) +# if defined(_CRAYMPP) || defined(_CRAYT3D) || defined(_CRAYT3E) +# define LZO_ARCH_CRAY_MPP 1 +# elif defined(_CRAY1) +# define LZO_ARCH_CRAY_PVP 1 +# endif +# endif +#endif #if !defined(__LZO_ARCH_OVERRIDE) #if defined(LZO_ARCH_GENERIC) # define LZO_INFO_ARCH "generic" @@ -593,6 +672,9 @@ #elif defined(__alpha__) || defined(__alpha) || defined(_M_ALPHA) # define LZO_ARCH_ALPHA 1 # define LZO_INFO_ARCH "alpha" +#elif (LZO_ARCH_CRAY_MPP) && (defined(_CRAYT3D) || defined(_CRAYT3E)) +# define LZO_ARCH_ALPHA 1 +# define LZO_INFO_ARCH "alpha" #elif defined(__amd64__) || defined(__x86_64__) || defined(_M_AMD64) # define LZO_ARCH_AMD64 1 # define LZO_INFO_ARCH "amd64" @@ -600,6 +682,16 @@ # define LZO_ARCH_ARM 1 # define LZO_ARCH_ARM_THUMB 1 # define LZO_INFO_ARCH "arm_thumb" +#elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICCARM__) +# define LZO_ARCH_ARM 1 +# if defined(__CPU_MODE__) && ((__CPU_MODE__)+0 == 1) +# define LZO_ARCH_ARM_THUMB 1 +# define LZO_INFO_ARCH "arm_thumb" +# elif defined(__CPU_MODE__) && ((__CPU_MODE__)+0 == 2) +# define LZO_INFO_ARCH "arm" +# else +# define LZO_INFO_ARCH "arm" +# endif #elif defined(__arm__) || defined(_M_ARM) # define LZO_ARCH_ARM 1 # define LZO_INFO_ARCH "arm" @@ -615,6 +707,9 @@ #elif defined(__cris__) # define LZO_ARCH_CRIS 1 # define LZO_INFO_ARCH "cris" +#elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICCEZ80__) +# define LZO_ARCH_EZ80 1 +# define LZO_INFO_ARCH "ez80" #elif defined(__H8300__) || defined(__H8300H__) || defined(__H8300S__) || defined(__H8300SX__) # define LZO_ARCH_H8300 1 # define LZO_INFO_ARCH "h8300" @@ -639,10 +734,13 @@ #elif (UINT_MAX == LZO_0xffffL) && defined(__m32c__) # define LZO_ARCH_M16C 1 # define LZO_INFO_ARCH "m16c" +#elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICCM16C__) +# define LZO_ARCH_M16C 1 +# define LZO_INFO_ARCH "m16c" #elif defined(__m32r__) # define LZO_ARCH_M32R 1 # define LZO_INFO_ARCH "m32r" -#elif (LZO_OS_TOS) || defined(__m68k__) || defined(__m68000__) || defined(__mc68000__) || defined(_M_M68K) +#elif (LZO_OS_TOS) || defined(__m68k__) || defined(__m68000__) || defined(__mc68000__) || defined(__mc68020__) || defined(_M_M68K) # define LZO_ARCH_M68K 1 # define LZO_INFO_ARCH "m68k" #elif (UINT_MAX == LZO_0xffffL) && defined(__C251__) @@ -651,13 +749,19 @@ #elif (UINT_MAX == LZO_0xffffL) && defined(__C51__) # define LZO_ARCH_MCS51 1 # define LZO_INFO_ARCH "mcs51" +#elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICC8051__) +# define LZO_ARCH_MCS51 1 +# define LZO_INFO_ARCH "mcs51" #elif defined(__mips__) || defined(__mips) || defined(_MIPS_ARCH) || defined(_M_MRX000) # define LZO_ARCH_MIPS 1 # define LZO_INFO_ARCH "mips" #elif (UINT_MAX == LZO_0xffffL) && defined(__MSP430__) # define LZO_ARCH_MSP430 1 # define LZO_INFO_ARCH "msp430" -#elif defined(__powerpc__) || defined(__powerpc) || defined(__ppc__) || defined(__PPC__) || defined(_M_PPC) +#elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICC430__) +# define LZO_ARCH_MSP430 1 +# define LZO_INFO_ARCH "msp430" +#elif defined(__powerpc__) || defined(__powerpc) || defined(__ppc__) || defined(__PPC__) || defined(_M_PPC) || defined(_ARCH_PPC) || defined(_ARCH_PWR) # define LZO_ARCH_POWERPC 1 # define LZO_INFO_ARCH "powerpc" #elif defined(__s390__) || defined(__s390) || defined(__s390x__) || defined(__s390x) @@ -669,9 +773,26 @@ #elif defined(__sparc__) || defined(__sparc) || defined(__sparcv8) # define LZO_ARCH_SPARC 1 # define LZO_INFO_ARCH "sparc" +#elif defined(__SPU__) +# define LZO_ARCH_SPU 1 +# define LZO_INFO_ARCH "spu" #elif (UINT_MAX == LZO_0xffffL) && defined(__z80) # define LZO_ARCH_Z80 1 # define LZO_INFO_ARCH "z80" +#elif (LZO_ARCH_CRAY_PVP) +# if defined(_CRAYSV1) +# define LZO_ARCH_CRAY_SV1 1 +# define LZO_INFO_ARCH "cray_sv1" +# elif (_ADDR64) +# define LZO_ARCH_CRAY_T90 1 +# define LZO_INFO_ARCH "cray_t90" +# elif (_ADDR32) +# define LZO_ARCH_CRAY_YMP 1 +# define LZO_INFO_ARCH "cray_ymp" +# else +# define LZO_ARCH_CRAY_XMP 1 +# define LZO_INFO_ARCH "cray_xmp" +# endif #else # define LZO_ARCH_UNKNOWN 1 # define LZO_INFO_ARCH "unknown" @@ -725,7 +846,7 @@ # endif #endif #if !defined(__LZO_MM_OVERRIDE) -#if (LZO_OS_DOS16 || LZO_OS_OS216 || LZO_OS_WIN16) +#if (LZO_ARCH_I086) #if (UINT_MAX != LZO_0xffffL) # error "this should not happen" #endif @@ -756,6 +877,7 @@ #else # error "unknown memory model" #endif +#if (LZO_OS_DOS16 || LZO_OS_OS216 || LZO_OS_WIN16) #define LZO_HAVE_MM_HUGE_PTR 1 #define LZO_HAVE_MM_HUGE_ARRAY 1 #if (LZO_MM_TINY) @@ -808,6 +930,7 @@ extern "C" { #ifdef __cplusplus } #endif +#endif #elif (LZO_ARCH_C166) #if !defined(__MODEL__) # error "FIXME - C166 __MODEL__" @@ -858,23 +981,27 @@ extern "C" { #else # error "FIXME - MCS51 __MODEL__" #endif +#elif (LZO_ARCH_CRAY_PVP) +# define LZO_MM_PVP 1 #else # define LZO_MM_FLAT 1 #endif -#if (LZO_MM_FLAT) -# define LZO_INFO_MM "flat" -#elif (LZO_MM_TINY) -# define LZO_INFO_MM "tiny" -#elif (LZO_MM_SMALL) -# define LZO_INFO_MM "small" -#elif (LZO_MM_MEDIUM) -# define LZO_INFO_MM "medium" -#elif (LZO_MM_COMPACT) +#if (LZO_MM_COMPACT) # define LZO_INFO_MM "compact" -#elif (LZO_MM_LARGE) -# define LZO_INFO_MM "large" +#elif (LZO_MM_FLAT) +# define LZO_INFO_MM "flat" #elif (LZO_MM_HUGE) # define LZO_INFO_MM "huge" +#elif (LZO_MM_LARGE) +# define LZO_INFO_MM "large" +#elif (LZO_MM_MEDIUM) +# define LZO_INFO_MM "medium" +#elif (LZO_MM_PVP) +# define LZO_INFO_MM "pvp" +#elif (LZO_MM_SMALL) +# define LZO_INFO_MM "small" +#elif (LZO_MM_TINY) +# define LZO_INFO_MM "tiny" #else # error "unknown memory model" #endif @@ -911,7 +1038,9 @@ extern "C" { #endif #define __LZO_LSR(x,b) (((x)+0ul) >> (b)) #if !defined(LZO_SIZEOF_SHORT) -# if (USHRT_MAX == LZO_0xffffL) +# if (LZO_ARCH_CRAY_PVP) +# define LZO_SIZEOF_SHORT 8 +# elif (USHRT_MAX == LZO_0xffffL) # define LZO_SIZEOF_SHORT 2 # elif (__LZO_LSR(USHRT_MAX,7) == 1) # define LZO_SIZEOF_SHORT 1 @@ -928,7 +1057,9 @@ extern "C" { # endif #endif #if !defined(LZO_SIZEOF_INT) -# if (UINT_MAX == LZO_0xffffL) +# if (LZO_ARCH_CRAY_PVP) +# define LZO_SIZEOF_INT 8 +# elif (UINT_MAX == LZO_0xffffL) # define LZO_SIZEOF_INT 2 # elif (UINT_MAX == LZO_0xffffffffL) # define LZO_SIZEOF_INT 4 @@ -969,6 +1100,8 @@ extern "C" { # if (LZO_CC_GNUC >= 0x030300ul) # if ((__LONG_MAX__)+0 == (__LONG_LONG_MAX__)+0) # define LZO_SIZEOF_LONG_LONG LZO_SIZEOF_LONG +# elif (__LZO_LSR(__LONG_LONG_MAX__,30) == 1) +# define LZO_SIZEOF_LONG_LONG 4 # endif # endif # endif @@ -981,9 +1114,9 @@ extern "C" { # define LZO_SIZEOF_LONG_LONG 8 #elif (LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE) # define LZO_SIZEOF_LONG_LONG 8 -#elif ((LZO_OS_WIN32 || LZO_OS_WIN64) && LZO_CC_MSC && (_MSC_VER >= 1400)) +#elif ((LZO_OS_WIN32 || LZO_OS_WIN64 || defined(_WIN32)) && LZO_CC_MSC && (_MSC_VER >= 1400)) # define LZO_SIZEOF_LONG_LONG 8 -#elif (LZO_OS_WIN64) +#elif (LZO_OS_WIN64 || defined(_WIN64)) # define LZO_SIZEOF___INT64 8 #elif (LZO_ARCH_I386 && (LZO_CC_DMC)) # define LZO_SIZEOF_LONG_LONG 8 @@ -991,11 +1124,11 @@ extern "C" { # define LZO_SIZEOF_LONG_LONG 8 #elif (LZO_ARCH_I386 && (LZO_CC_INTELC && defined(__linux__))) # define LZO_SIZEOF_LONG_LONG 8 -#elif (LZO_ARCH_I386 && (LZO_CC_MWERKS || LZO_CC_PELLESC || LZO_CC_PGI)) +#elif (LZO_ARCH_I386 && (LZO_CC_MWERKS || LZO_CC_PELLESC || LZO_CC_PGI || LZO_CC_SUNPROC)) # define LZO_SIZEOF_LONG_LONG 8 #elif (LZO_ARCH_I386 && (LZO_CC_INTELC || LZO_CC_MSC)) # define LZO_SIZEOF___INT64 8 -#elif (LZO_OS_WIN32 && (LZO_CC_MSC)) +#elif ((LZO_OS_WIN32 || defined(_WIN32)) && (LZO_CC_MSC)) # define LZO_SIZEOF___INT64 8 #elif (LZO_ARCH_I386 && (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0520))) # define LZO_SIZEOF___INT64 8 @@ -1003,7 +1136,7 @@ extern "C" { # define LZO_SIZEOF___INT64 8 #elif (LZO_CC_WATCOMC && defined(_INTEGRAL_MAX_BITS) && (_INTEGRAL_MAX_BITS == 64)) # define LZO_SIZEOF___INT64 8 -#elif (LZO_OS_OS400) && defined(__LLP64_IFC__) +#elif (LZO_OS_OS400 || defined(__OS400__)) && defined(__LLP64_IFC__) # define LZO_SIZEOF_LONG_LONG 8 #elif (defined(__vms) || defined(__VMS)) && (__INITIAL_POINTER_SIZE+0 == 64) # define LZO_SIZEOF_LONG_LONG 8 @@ -1064,11 +1197,11 @@ extern "C" { #elif defined(__LLP64__) || defined(__LLP64) || defined(_LLP64) || defined(_WIN64) # define __LZO_WORDSIZE 8 # define LZO_SIZEOF_VOID_P 8 -#elif (LZO_OS_OS400) && defined(__LLP64_IFC__) +#elif (LZO_OS_OS400 || defined(__OS400__)) && defined(__LLP64_IFC__) # define LZO_SIZEOF_VOID_P LZO_SIZEOF_LONG # define LZO_SIZEOF_SIZE_T LZO_SIZEOF_LONG # define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_LONG -#elif (LZO_OS_OS400) +#elif (LZO_OS_OS400 || defined(__OS400__)) # define __LZO_WORDSIZE LZO_SIZEOF_LONG # define LZO_SIZEOF_VOID_P 16 # define LZO_SIZEOF_SIZE_T LZO_SIZEOF_LONG @@ -1077,6 +1210,11 @@ extern "C" { # define LZO_SIZEOF_VOID_P 8 # define LZO_SIZEOF_SIZE_T LZO_SIZEOF_LONG # define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_LONG +#elif (LZO_ARCH_SPU) +# if 0 +# define __LZO_WORDSIZE 16 +# endif +# define LZO_SIZEOF_VOID_P 4 #else # define LZO_SIZEOF_VOID_P LZO_SIZEOF_LONG #endif @@ -1112,15 +1250,30 @@ extern "C" { # define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_SIZE_T #endif #endif -#if !defined(LZO_ABI_BIG_ENDIAN) && !defined(LZO_ABI_LITTLE_ENDIAN) && !defined(LZO_ABI_NEUTRAL_ENDIAN) -#if (LZO_ARCH_AMD64 || LZO_ARCH_CRIS || LZO_ARCH_I086 || LZO_ARCH_I386 || LZO_ARCH_MSP430) +#if defined(LZO_ABI_NEUTRAL_ENDIAN) +# undef LZO_ABI_BIG_ENDIAN +# undef LZO_ABI_LITTLE_ENDIAN +#elif !defined(LZO_ABI_BIG_ENDIAN) && !defined(LZO_ABI_LITTLE_ENDIAN) +#if (LZO_ARCH_ALPHA) && (LZO_ARCH_CRAY_MPP) +# define LZO_ABI_BIG_ENDIAN 1 +#elif (LZO_ARCH_ALPHA || LZO_ARCH_AMD64 || LZO_ARCH_BLACKFIN || LZO_ARCH_CRIS || LZO_ARCH_I086 || LZO_ARCH_I386 || LZO_ARCH_MSP430) # define LZO_ABI_LITTLE_ENDIAN 1 #elif (LZO_ARCH_M68K || LZO_ARCH_S390) # define LZO_ABI_BIG_ENDIAN 1 +#elif 1 && defined(__IAR_SYSTEMS_ICC__) && defined(__LITTLE_ENDIAN__) +# if (__LITTLE_ENDIAN__ == 1) +# define LZO_ABI_LITTLE_ENDIAN 1 +# else +# define LZO_ABI_BIG_ENDIAN 1 +# endif #elif 1 && defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__) # define LZO_ABI_BIG_ENDIAN 1 #elif 1 && defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__) # define LZO_ABI_LITTLE_ENDIAN 1 +#elif 1 && (LZO_ARCH_ARM) && defined(__ARMEB__) && !defined(__ARMEL__) +# define LZO_ABI_BIG_ENDIAN 1 +#elif 1 && (LZO_ARCH_ARM) && defined(__ARMEL__) && !defined(__ARMEB__) +# define LZO_ABI_LITTLE_ENDIAN 1 #elif 1 && (LZO_ARCH_MIPS) && defined(__MIPSEB__) && !defined(__MIPSEL__) # define LZO_ABI_BIG_ENDIAN 1 #elif 1 && (LZO_ARCH_MIPS) && defined(__MIPSEL__) && !defined(__MIPSEB__) @@ -1189,25 +1342,66 @@ extern "C" { #elif (LZO_CC_MWERKS) && defined(__MSL__) # define LZO_LIBC_MSL __MSL__ # define LZO_INFO_LIBC "msl" +#elif 1 && defined(__IAR_SYSTEMS_ICC__) +# define LZO_LIBC_ISOC90 1 +# define LZO_INFO_LIBC "isoc90" #else # define LZO_LIBC_DEFAULT 1 # define LZO_INFO_LIBC "default" #endif #endif +#if !defined(__lzo_gnuc_extension__) #if (LZO_CC_GNUC >= 0x020800ul) -# define __lzo_gnuc_extension__ __extension__ +# define __lzo_gnuc_extension__ __extension__ #elif (LZO_CC_LLVM || LZO_CC_PATHSCALE) -# define __lzo_gnuc_extension__ __extension__ +# define __lzo_gnuc_extension__ __extension__ #else # define __lzo_gnuc_extension__ #endif +#endif +#if !defined(__lzo_ua_volatile) +# define __lzo_ua_volatile volatile +#endif +#if !defined(__lzo_alignof) #if (LZO_CC_CILLY || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE || LZO_CC_PGI) -# define lzo_alignof(e) __alignof__(e) +# define __lzo_alignof(e) __alignof__(e) #elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 700)) -# define lzo_alignof(e) __alignof__(e) +# define __lzo_alignof(e) __alignof__(e) #elif (LZO_CC_MSC && (_MSC_VER >= 1300)) -# define lzo_alignof(e) __alignof(e) +# define __lzo_alignof(e) __alignof(e) +#endif #endif +#if defined(__lzo_alignof) +# define __lzo_HAVE_alignof 1 +#endif +#if !defined(__lzo_constructor) +#if (LZO_CC_GNUC >= 0x030400ul) +# define __lzo_constructor __attribute__((__constructor__,__used__)) +#elif (LZO_CC_GNUC >= 0x020700ul) +# define __lzo_constructor __attribute__((__constructor__)) +#elif (LZO_CC_LLVM || LZO_CC_PATHSCALE) +# define __lzo_constructor __attribute__((__constructor__)) +#endif +#endif +#if defined(__lzo_constructor) +# define __lzo_HAVE_constructor 1 +#endif +#if !defined(__lzo_destructor) +#if (LZO_CC_GNUC >= 0x030400ul) +# define __lzo_destructor __attribute__((__destructor__,__used__)) +#elif (LZO_CC_GNUC >= 0x020700ul) +# define __lzo_destructor __attribute__((__destructor__)) +#elif (LZO_CC_LLVM || LZO_CC_PATHSCALE) +# define __lzo_destructor __attribute__((__destructor__)) +#endif +#endif +#if defined(__lzo_destructor) +# define __lzo_HAVE_destructor 1 +#endif +#if defined(__lzo_HAVE_destructor) && !defined(__lzo_HAVE_constructor) +# error "this should not happen" +#endif +#if !defined(__lzo_inline) #if (LZO_CC_TURBOC && (__TURBOC__ <= 0x0295)) #elif defined(__cplusplus) # define __lzo_inline inline @@ -1226,22 +1420,38 @@ extern "C" { #elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) # define __lzo_inline inline #endif +#endif +#if defined(__lzo_inline) +# define __lzo_HAVE_inline 1 +#else +# define __lzo_inline +#endif +#if !defined(__lzo_forceinline) #if (LZO_CC_GNUC >= 0x030200ul) # define __lzo_forceinline __inline__ __attribute__((__always_inline__)) -#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 450) && (LZO_OS_WIN32 || LZO_OS_WIN64)) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 450) && LZO_CC_SYNTAX_MSC) # define __lzo_forceinline __forceinline -#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 800)) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 800) && LZO_CC_SYNTAX_GNUC) # define __lzo_forceinline __inline__ __attribute__((__always_inline__)) #elif (LZO_CC_LLVM || LZO_CC_PATHSCALE) # define __lzo_forceinline __inline__ __attribute__((__always_inline__)) #elif (LZO_CC_MSC && (_MSC_VER >= 1200)) # define __lzo_forceinline __forceinline #endif -#if (LZO_CC_GNUC >= 0x030200ul) +#endif +#if defined(__lzo_forceinline) +# define __lzo_HAVE_forceinline 1 +#else +# define __lzo_forceinline +#endif +#if !defined(__lzo_noinline) +#if 1 && (LZO_ARCH_I386) && (LZO_CC_GNUC >= 0x040000ul) && (LZO_CC_GNUC < 0x040003ul) +# define __lzo_noinline __attribute__((__noinline__,__used__)) +#elif (LZO_CC_GNUC >= 0x030200ul) # define __lzo_noinline __attribute__((__noinline__)) -#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 600) && (LZO_OS_WIN32 || LZO_OS_WIN64)) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 600) && LZO_CC_SYNTAX_MSC) # define __lzo_noinline __declspec(noinline) -#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 800)) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 800) && LZO_CC_SYNTAX_GNUC) # define __lzo_noinline __attribute__((__noinline__)) #elif (LZO_CC_LLVM || LZO_CC_PATHSCALE) # define __lzo_noinline __attribute__((__noinline__)) @@ -1253,37 +1463,68 @@ extern "C" { # define __lzo_noinline __declspec(noinline) # endif #endif -#if (defined(__lzo_forceinline) || defined(__lzo_noinline)) && !defined(__lzo_inline) +#endif +#if defined(__lzo_noinline) +# define __lzo_HAVE_noinline 1 +#else +# define __lzo_noinline +#endif +#if (defined(__lzo_HAVE_forceinline) || defined(__lzo_HAVE_noinline)) && !defined(__lzo_HAVE_inline) # error "this should not happen" #endif +#if !defined(__lzo_noreturn) #if (LZO_CC_GNUC >= 0x020700ul) # define __lzo_noreturn __attribute__((__noreturn__)) -#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 450) && (LZO_OS_WIN32 || LZO_OS_WIN64)) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 450) && LZO_CC_SYNTAX_MSC) # define __lzo_noreturn __declspec(noreturn) -#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 600) && (LZO_OS_POSIX)) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 600) && LZO_CC_SYNTAX_GNUC) # define __lzo_noreturn __attribute__((__noreturn__)) #elif (LZO_CC_LLVM || LZO_CC_PATHSCALE) # define __lzo_noreturn __attribute__((__noreturn__)) #elif (LZO_CC_MSC && (_MSC_VER >= 1200)) # define __lzo_noreturn __declspec(noreturn) #endif -#if (LZO_CC_GNUC >= 0x030400ul) -# define __lzo_constructor __attribute__((__constructor__,__used__)) -#elif (LZO_CC_GNUC >= 0x020700ul) -# define __lzo_constructor __attribute__((__constructor__)) +#endif +#if defined(__lzo_noreturn) +# define __lzo_HAVE_noreturn 1 +#else +# define __lzo_noreturn +#endif +#if !defined(__lzo_nothrow) +#if (LZO_CC_GNUC >= 0x030300ul) +# define __lzo_nothrow __attribute__((__nothrow__)) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 450) && LZO_CC_SYNTAX_MSC) && defined(__cplusplus) +# define __lzo_nothrow __declspec(nothrow) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 800) && LZO_CC_SYNTAX_GNUC) +# define __lzo_nothrow __attribute__((__nothrow__)) #elif (LZO_CC_LLVM || LZO_CC_PATHSCALE) -# define __lzo_constructor __attribute__((__constructor__)) +# define __lzo_nothrow __attribute__((__nothrow__)) +#elif (LZO_CC_MSC && (_MSC_VER >= 1200)) && defined(__cplusplus) +# define __lzo_nothrow __declspec(nothrow) +#endif #endif +#if defined(__lzo_nothrow) +# define __lzo_HAVE_nothrow 1 +#else +# define __lzo_nothrow +#endif +#if !defined(__lzo_restrict) #if (LZO_CC_GNUC >= 0x030400ul) -# define __lzo_destructor __attribute__((__destructor__,__used__)) -#elif (LZO_CC_GNUC >= 0x020700ul) -# define __lzo_destructor __attribute__((__destructor__)) -#elif (LZO_CC_LLVM || LZO_CC_PATHSCALE) -# define __lzo_destructor __attribute__((__destructor__)) +# define __lzo_restrict __restrict__ +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 600) && LZO_CC_SYNTAX_GNUC) +# define __lzo_restrict __restrict__ +#elif (LZO_CC_LLVM) +# define __lzo_restrict __restrict__ +#elif (LZO_CC_MSC && (_MSC_VER >= 1400)) +# define __lzo_restrict __restrict #endif -#if defined(__lzo_destructor) && !defined(__lzo_constructor) -# error "this should not happen" #endif +#if defined(__lzo_restrict) +# define __lzo_HAVE_restrict 1 +#else +# define __lzo_restrict +#endif +#if !defined(__lzo_likely) && !defined(__lzo_unlikely) #if (LZO_CC_GNUC >= 0x030200ul) # define __lzo_likely(e) (__builtin_expect(!!(e),1)) # define __lzo_unlikely(e) (__builtin_expect(!!(e),0)) @@ -1293,8 +1534,16 @@ extern "C" { #elif (LZO_CC_LLVM || LZO_CC_PATHSCALE) # define __lzo_likely(e) (__builtin_expect(!!(e),1)) # define __lzo_unlikely(e) (__builtin_expect(!!(e),0)) +#endif +#endif +#if defined(__lzo_likely) +# define __lzo_HAVE_likely 1 #else # define __lzo_likely(e) (e) +#endif +#if defined(__lzo_unlikely) +# define __lzo_HAVE_unlikely 1 +#else # define __lzo_unlikely(e) (e) #endif #if !defined(LZO_UNUSED) @@ -1342,6 +1591,15 @@ extern "C" { # define LZO_UNUSED_LABEL(l) switch(0) case 1:goto l # endif #endif +#if !defined(LZO_DEFINE_UNINITIALIZED_VAR) +# if 0 +# define LZO_DEFINE_UNINITIALIZED_VAR(type,var,init) type var +# elif 0 && (LZO_CC_GNUC) +# define LZO_DEFINE_UNINITIALIZED_VAR(type,var,init) type var = var +# else +# define LZO_DEFINE_UNINITIALIZED_VAR(type,var,init) type var = init +# endif +#endif #if !defined(LZO_COMPILE_TIME_ASSERT_HEADER) # if (LZO_CC_AZTECC || LZO_CC_ZORTECHC) # define LZO_COMPILE_TIME_ASSERT_HEADER(e) extern int __lzo_cta[1-!(e)]; @@ -1405,6 +1663,8 @@ extern "C" { # else # define __lzo_cdecl_sighandler __cdecl # endif +#elif (LZO_ARCH_I386) && (LZO_CC_WATCOMC) +# define __lzo_cdecl __cdecl #elif (LZO_ARCH_M68K && LZO_OS_TOS && (LZO_CC_PUREC || LZO_CC_TURBOC)) # define __lzo_cdecl cdecl #endif @@ -1426,6 +1686,7 @@ extern "C" { #if !defined(__lzo_cdecl_va) # define __lzo_cdecl_va __lzo_cdecl #endif +#if !defined(LZO_CFG_NO_WINDOWS_H) #if (LZO_OS_CYGWIN || (LZO_OS_EMX && defined(__RSXNT__)) || LZO_OS_WIN32 || LZO_OS_WIN64) # if (LZO_CC_WATCOMC && (__WATCOMC__ < 1000)) # elif (LZO_OS_WIN32 && LZO_CC_GNUC) && defined(__PW32__) @@ -1434,6 +1695,7 @@ extern "C" { # define LZO_HAVE_WINDOWS_H 1 # endif #endif +#endif #if (LZO_ARCH_ALPHA) # define LZO_OPT_AVOID_UINT_INDEX 1 # define LZO_OPT_AVOID_SHORT 1 @@ -1568,7 +1830,7 @@ extern "C" { #undef LZO_HAVE_CONFIG_H #include "minilzo.h" -#if !defined(MINILZO_VERSION) || (MINILZO_VERSION != 0x2020) +#if !defined(MINILZO_VERSION) || (MINILZO_VERSION != 0x2030) # error "version mismatch in miniLZO source files" #endif @@ -1589,9 +1851,18 @@ extern "C" { #if defined(LZO_CFG_NO_UNALIGNED) # define ACC_CFG_NO_UNALIGNED 1 #endif +#if defined(LZO_ARCH_GENERIC) +# define ACC_ARCH_GENERIC 1 +#endif +#if defined(LZO_ABI_NEUTRAL_ENDIAN) +# define ACC_ABI_NEUTRAL_ENDIAN 1 +#endif #if defined(LZO_HAVE_CONFIG_H) # define ACC_CONFIG_NO_HEADER 1 #endif +#if defined(LZO_CFG_EXTRA_CONFIG_HEADER) +# include LZO_CFG_EXTRA_CONFIG_HEADER +#endif #if defined(__LZOCONF_H) || defined(__LZOCONF_H_INCLUDED) # error "include this file first" #endif @@ -1614,6 +1885,11 @@ extern "C" { # pragma warning(disable: 4514 4710 4711) #endif +#if (LZO_CC_SUNPROC) +# pragma error_messages(off,E_END_OF_LOOP_CODE_NOT_REACHED) +# pragma error_messages(off,E_LOOP_NOT_ENTERED_AT_TOP) +#endif + #if defined(__LZO_MMODEL_HUGE) && (!LZO_HAVE_MM_HUGE_PTR) # error "this should not happen - check defines for __huge" #endif @@ -1829,6 +2105,10 @@ extern "C" { #define PTR(a) ((lzo_bytep) (a)) #define PTR_ALIGNED_4(a) ((ACC_PTR_FP_OFF(a) & 3) == 0) #define PTR_ALIGNED2_4(a,b) (((ACC_PTR_FP_OFF(a) | ACC_PTR_FP_OFF(b)) & 3) == 0) +#elif (LZO_MM_PVP) +#define PTR(a) ((lzo_bytep) (a)) +#define PTR_ALIGNED_8(a) ((((lzo_uintptr_t)(a)) >> 61) == 0) +#define PTR_ALIGNED2_8(a,b) ((((lzo_uintptr_t)(a)|(lzo_uintptr_t)(b)) >> 61) == 0) #else #define PTR(a) ((lzo_uintptr_t) (a)) #define PTR_LINEAR(a) PTR(a) @@ -1907,6 +2187,9 @@ __lzo_ptr_linear(const lzo_voidp ptr) #if (LZO_ARCH_I086) p = (((lzo_uintptr_t)(ACC_PTR_FP_SEG(ptr))) << (16 - ACC_MM_AHSHIFT)) + (ACC_PTR_FP_OFF(ptr)); +#elif (LZO_MM_PVP) + p = (lzo_uintptr_t) (ptr); + p = (p << 3) | (p >> 61); #else p = (lzo_uintptr_t) PTR_LINEAR(ptr); #endif @@ -1928,14 +2211,14 @@ __lzo_align_gap(const lzo_voidp ptr, lzo_uint size) assert(size > 0); assert((long)n >= 0); - assert(n <= s); + assert(n <= size); return (unsigned)n; } #endif -/* If you use the LZO library in a product, you *must* keep this - * copyright string in the executable of your product. +/* If you use the LZO library in a product, I would appreciate that you + * keep this copyright string in the executable of your product. */ const char __lzo_copyright[] = @@ -1944,10 +2227,10 @@ const char __lzo_copyright[] = #else "\r\n\n" "LZO data compression library.\n" - "$Copyright: LZO (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Markus Franz Xaver Johannes Oberhumer\n" + "$Copyright: LZO (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Markus Franz Xaver Johannes Oberhumer\n" "\n" "http://www.oberhumer.com $\n\n" - "$Id: minilzo.c,v 1.5 2007/04/30 10:45:37 seppel Exp $\n" + "$Id: minilzo.c,v 1.5.2.1 2008/10/14 16:41:58 seppel Exp $\n" "$Built: " __DATE__ " " __TIME__ " $\n" "$Info: " LZO_INFO_STRING " $\n"; #endif @@ -2080,7 +2363,7 @@ LZOLIB_PUBLIC(lzo_hvoid_p, lzo_hmemcpy) (lzo_hvoid_p dest, const lzo_hvoid_p src #if (LZO_HAVE_MM_HUGE_PTR) || !defined(HAVE_MEMCPY) lzo_hbyte_p p1 = (lzo_hbyte_p) dest; const lzo_hbyte_p p2 = (const lzo_hbyte_p) src; - if (len <= 0 || p1 == p2) + if (!(len > 0) || p1 == p2) return dest; do *p1++ = *p2++; @@ -2095,7 +2378,7 @@ LZOLIB_PUBLIC(lzo_hvoid_p, lzo_hmemmove) (lzo_hvoid_p dest, const lzo_hvoid_p sr #if (LZO_HAVE_MM_HUGE_PTR) || !defined(HAVE_MEMMOVE) lzo_hbyte_p p1 = (lzo_hbyte_p) dest; const lzo_hbyte_p p2 = (const lzo_hbyte_p) src; - if (len <= 0 || p1 == p2) + if (!(len > 0) || p1 == p2) return dest; if (p1 < p2) { @@ -2162,6 +2445,7 @@ _lzo_config_check(void) { lzo_bool r = 1; union { unsigned char c[2*sizeof(lzo_xint)]; lzo_xint l[2]; } u; + lzo_uintptr_t p; #if !defined(LZO_CFG_NO_CONFIG_CHECK) #if defined(LZO_ABI_BIG_ENDIAN) @@ -2173,16 +2457,18 @@ _lzo_config_check(void) r &= (u.l[0] == 128); #endif #if defined(LZO_UNALIGNED_OK_2) + p = (lzo_uintptr_t) (const lzo_voidp) &u.c[0]; u.l[0] = u.l[1] = 0; - r &= ((* (const lzo_ushortp) (const lzo_voidp) &u.c[1]) == 0); + r &= ((* (const lzo_ushortp) (p+1)) == 0); #endif #if defined(LZO_UNALIGNED_OK_4) + p = (lzo_uintptr_t) (const lzo_voidp) &u.c[0]; u.l[0] = u.l[1] = 0; - r &= ((* (const lzo_uint32p) (const lzo_voidp) &u.c[1]) == 0); + r &= ((* (const lzo_uint32p) (p+1)) == 0); #endif #endif - LZO_UNUSED(u); + LZO_UNUSED(u); LZO_UNUSED(p); return r == 1 ? LZO_E_OK : LZO_E_ERROR; } diff --git a/minilzo/minilzo.h b/minilzo/minilzo.h index 04bf4e1..0aff50e 100644 --- a/minilzo/minilzo.h +++ b/minilzo/minilzo.h @@ -2,6 +2,9 @@ This file is part of the LZO real-time data compression library. + Copyright (C) 2008 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2007 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2006 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2005 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2004 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2003 Markus Franz Xaver Johannes Oberhumer @@ -15,8 +18,9 @@ All Rights Reserved. The LZO library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License, - version 2, as published by the Free Software Foundation. + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. The LZO library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -43,7 +47,7 @@ #ifndef __MINILZO_H #define __MINILZO_H -#define MINILZO_VERSION 0x2020 +#define MINILZO_VERSION 0x2030 #ifdef __LZOCONF_H # error "you cannot use both LZO and miniLZO" From 6a1bed028110ba9038ba6cff1b0c14b718c35b6f Mon Sep 17 00:00:00 2001 From: seppel Date: Tue, 27 Jan 2009 18:08:46 +0000 Subject: [PATCH 03/53] . --- ChangeLog | 5 + cp-demangle.c | 410 +++++++++++++++++++++++++++++++++++++++++++------- cp-demangle.h | 2 +- cplus-dem.c | 6 +- demangle.h | 46 +++++- output/out.cc | 4 +- 6 files changed, 409 insertions(+), 64 deletions(-) diff --git a/ChangeLog b/ChangeLog index 944df0d..bc2ea7a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,11 @@ HT ChangeLog ============== +version 2.0.16: + - [x86] intel avx update + - updated c++ demangler + - small crash fix + version 2.0.15: - [Win32] removed a debug printf - fixed clipboard view diff --git a/cp-demangle.c b/cp-demangle.c index d4b40da..53e9645 100644 --- a/cp-demangle.c +++ b/cp-demangle.c @@ -1,5 +1,6 @@ /* Demangler for g++ V3 ABI. - Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. + Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 + Free Software Foundation, Inc. Written by Ian Lance Taylor . This file is part of the libiberty library, which is part of GCC. @@ -296,6 +297,9 @@ struct d_print_info struct d_print_mod *modifiers; /* Set to 1 if we saw a demangling error. */ int demangle_failure; + /* The current index into any template argument packs we are using + for printing. */ + int pack_index; }; #ifdef CP_DEMANGLE_DEBUG @@ -615,6 +619,9 @@ d_dump (struct demangle_component *dc, int indent) case DEMANGLE_COMPONENT_PTRMEM_TYPE: printf ("pointer to member type\n"); break; + case DEMANGLE_COMPONENT_FIXED_TYPE: + printf ("fixed-point type\n"); + break; case DEMANGLE_COMPONENT_ARGLIST: printf ("argument list\n"); break; @@ -657,6 +664,12 @@ d_dump (struct demangle_component *dc, int indent) case DEMANGLE_COMPONENT_CHARACTER: printf ("character '%c'\n", dc->u.s_character.character); return; + case DEMANGLE_COMPONENT_DECLTYPE: + printf ("decltype\n"); + break; + case DEMANGLE_COMPONENT_PACK_EXPANSION: + printf ("pack expansion\n"); + break; } d_dump (d_left (dc), indent + 2); @@ -800,10 +813,10 @@ d_make_comp (struct d_info *di, enum demangle_component_type type, case DEMANGLE_COMPONENT_COMPLEX: case DEMANGLE_COMPONENT_IMAGINARY: case DEMANGLE_COMPONENT_VENDOR_TYPE: - case DEMANGLE_COMPONENT_ARGLIST: - case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST: case DEMANGLE_COMPONENT_CAST: case DEMANGLE_COMPONENT_JAVA_RESOURCE: + case DEMANGLE_COMPONENT_DECLTYPE: + case DEMANGLE_COMPONENT_PACK_EXPANSION: if (left == NULL) return NULL; break; @@ -824,6 +837,8 @@ d_make_comp (struct d_info *di, enum demangle_component_type type, case DEMANGLE_COMPONENT_RESTRICT_THIS: case DEMANGLE_COMPONENT_VOLATILE_THIS: case DEMANGLE_COMPONENT_CONST_THIS: + case DEMANGLE_COMPONENT_ARGLIST: + case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST: break; /* Other types should not be seen here. */ @@ -1419,13 +1434,14 @@ const struct demangle_operator_info cplus_demangle_operators[] = { "aa", NL ("&&"), 2 }, { "ad", NL ("&"), 1 }, { "an", NL ("&"), 2 }, - { "cl", NL ("()"), 0 }, + { "cl", NL ("()"), 2 }, { "cm", NL (","), 2 }, { "co", NL ("~"), 1 }, { "dV", NL ("/="), 2 }, { "da", NL ("delete[]"), 1 }, { "de", NL ("*"), 1 }, { "dl", NL ("delete"), 1 }, + { "dt", NL ("."), 2 }, { "dv", NL ("/"), 2 }, { "eO", NL ("^="), 2 }, { "eo", NL ("^"), 2 }, @@ -1880,6 +1896,12 @@ cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT] = /* y */ { NL ("unsigned long long"), NL ("unsigned long long"), D_PRINT_UNSIGNED_LONG_LONG }, /* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT }, + /* 26 */ { NL ("decimal32"), NL ("decimal32"), D_PRINT_DEFAULT }, + /* 27 */ { NL ("decimal64"), NL ("decimal64"), D_PRINT_DEFAULT }, + /* 28 */ { NL ("decimal128"), NL ("decimal128"), D_PRINT_DEFAULT }, + /* 29 */ { NL ("half"), NL ("half"), D_PRINT_FLOAT }, + /* 30 */ { NL ("char16_t"), NL ("char16_t"), D_PRINT_DEFAULT }, + /* 31 */ { NL ("char32_t"), NL ("char32_t"), D_PRINT_DEFAULT }, }; CP_STATIC_IF_GLIBCPP_V3 @@ -2043,6 +2065,76 @@ cplus_demangle_type (struct d_info *di) cplus_demangle_type (di), ret); break; + case 'D': + can_subst = 0; + d_advance (di, 1); + peek = d_next_char (di); + switch (peek) + { + case 'T': + case 't': + /* decltype (expression) */ + ret = d_make_comp (di, DEMANGLE_COMPONENT_DECLTYPE, + d_expression (di), NULL); + if (ret && d_next_char (di) != 'E') + ret = NULL; + break; + + case 'p': + /* Pack expansion. */ + ret = d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION, + cplus_demangle_type (di), NULL); + break; + + case 'f': + /* 32-bit decimal floating point */ + ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[26]); + di->expansion += ret->u.s_builtin.type->len; + break; + case 'd': + /* 64-bit DFP */ + ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[27]); + di->expansion += ret->u.s_builtin.type->len; + break; + case 'e': + /* 128-bit DFP */ + ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[28]); + di->expansion += ret->u.s_builtin.type->len; + break; + case 'h': + /* 16-bit half-precision FP */ + ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[29]); + di->expansion += ret->u.s_builtin.type->len; + break; + case 's': + /* char16_t */ + ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[30]); + di->expansion += ret->u.s_builtin.type->len; + break; + case 'i': + /* char32_t */ + ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[31]); + di->expansion += ret->u.s_builtin.type->len; + break; + + case 'F': + /* Fixed point types. DF */ + ret = d_make_empty (di); + ret->type = DEMANGLE_COMPONENT_FIXED_TYPE; + if ((ret->u.s_fixed.accum = IS_DIGIT (d_peek_char (di)))) + /* For demangling we don't care about the bits. */ + d_number (di); + ret->u.s_fixed.length = cplus_demangle_type (di); + d_number (di); + peek = d_next_char (di); + ret->u.s_fixed.sat = (peek == 's'); + break; + + default: + return NULL; + } + break; + default: return NULL; } @@ -2334,6 +2426,13 @@ d_template_args (struct d_info *di) if (! d_check_char (di, 'I')) return NULL; + if (d_peek_char (di) == 'E') + { + /* An argument pack can be empty. */ + d_advance (di, 1); + return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, NULL, NULL); + } + al = NULL; pal = &al; while (1) @@ -2383,14 +2482,54 @@ d_template_arg (struct d_info *di) case 'L': return d_expr_primary (di); + case 'I': + /* An argument pack. */ + return d_template_args (di); + default: return cplus_demangle_type (di); } } +/* Subroutine of ::= cl + E */ + +static struct demangle_component * +d_exprlist (struct d_info *di) +{ + struct demangle_component *list = NULL; + struct demangle_component **p = &list; + + if (d_peek_char (di) == 'E') + { + d_advance (di, 1); + return d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, NULL, NULL); + } + + while (1) + { + struct demangle_component *arg = d_expression (di); + if (arg == NULL) + return NULL; + + *p = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, arg, NULL); + if (*p == NULL) + return NULL; + p = &d_right (*p); + + if (d_peek_char (di) == 'E') + { + d_advance (di, 1); + break; + } + } + + return list; +} + /* ::= <(unary) operator-name> ::= <(binary) operator-name> ::= <(trinary) operator-name> + ::= cl + E ::= st ::= ::= sr @@ -2423,6 +2562,26 @@ d_expression (struct d_info *di) d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name, d_template_args (di))); } + else if (peek == 's' + && (d_peek_next_char (di) == 'T' || d_peek_next_char (di) == 'R')) + { + /* Just demangle a parameter placeholder as its type. */ + d_advance (di, 2); + return cplus_demangle_type (di); + } + else if (IS_DIGIT (peek)) + { + /* We can get an unqualified name as an expression in the case of + a dependent member access, i.e. decltype(T().i). */ + struct demangle_component *name = d_unqualified_name (di); + if (name == NULL) + return NULL; + if (d_peek_char (di) == 'I') + return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name, + d_template_args (di)); + else + return name; + } else { struct demangle_component *op; @@ -2463,13 +2622,18 @@ d_expression (struct d_info *di) case 2: { struct demangle_component *left; + struct demangle_component *right; left = d_expression (di); + if (!strcmp (op->u.s_operator.op->code, "cl")) + right = d_exprlist (di); + else + right = d_expression (di); + return d_make_comp (di, DEMANGLE_COMPONENT_BINARY, op, d_make_comp (di, DEMANGLE_COMPONENT_BINARY_ARGS, - left, - d_expression (di))); + left, right)); } case 3: { @@ -2679,21 +2843,24 @@ d_substitution (struct d_info *di, int prefix) c = d_next_char (di); if (c == '_' || IS_DIGIT (c) || IS_UPPER (c)) { - int id; + unsigned int id; id = 0; if (c != '_') { do { + unsigned int new_id; + if (IS_DIGIT (c)) - id = id * 36 + c - '0'; + new_id = id * 36 + c - '0'; else if (IS_UPPER (c)) - id = id * 36 + c - 'A' + 10; + new_id = id * 36 + c - 'A' + 10; else return NULL; - if (id < 0) + if (new_id < id) return NULL; + id = new_id; c = d_next_char (di); } while (c != '_'); @@ -2701,7 +2868,7 @@ d_substitution (struct d_info *di, int prefix) ++id; } - if (id >= di->next_sub) + if (id >= (unsigned int) di->next_sub) return NULL; ++di->did_subs; @@ -2962,6 +3129,123 @@ cplus_demangle_print (int options, const struct demangle_component *dc, return dgs.buf; } +/* Returns the I'th element of the template arglist ARGS, or NULL on + failure. */ + +static struct demangle_component * +d_index_template_argument (struct demangle_component *args, int i) +{ + struct demangle_component *a; + + for (a = args; + a != NULL; + a = d_right (a)) + { + if (a->type != DEMANGLE_COMPONENT_TEMPLATE_ARGLIST) + return NULL; + if (i <= 0) + break; + --i; + } + if (i != 0 || a == NULL) + return NULL; + + return d_left (a); +} + +/* Returns the template argument from the current context indicated by DC, + which is a DEMANGLE_COMPONENT_TEMPLATE_PARAM, or NULL. */ + +static struct demangle_component * +d_lookup_template_argument (struct d_print_info *dpi, + const struct demangle_component *dc) +{ + if (dpi->templates == NULL) + { + d_print_error (dpi); + return NULL; + } + + return d_index_template_argument + (d_right (dpi->templates->template_decl), + dc->u.s_number.number); +} + +/* Returns a template argument pack used in DC (any will do), or NULL. */ + +static struct demangle_component * +d_find_pack (struct d_print_info *dpi, + const struct demangle_component *dc) +{ + struct demangle_component *a; + if (dc == NULL) + return NULL; + + switch (dc->type) + { + case DEMANGLE_COMPONENT_TEMPLATE_PARAM: + a = d_lookup_template_argument (dpi, dc); + if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST) + return a; + return NULL; + + case DEMANGLE_COMPONENT_PACK_EXPANSION: + return NULL; + + case DEMANGLE_COMPONENT_NAME: + case DEMANGLE_COMPONENT_OPERATOR: + case DEMANGLE_COMPONENT_BUILTIN_TYPE: + case DEMANGLE_COMPONENT_SUB_STD: + case DEMANGLE_COMPONENT_CHARACTER: + return NULL; + + case DEMANGLE_COMPONENT_EXTENDED_OPERATOR: + return d_find_pack (dpi, dc->u.s_extended_operator.name); + case DEMANGLE_COMPONENT_CTOR: + return d_find_pack (dpi, dc->u.s_ctor.name); + case DEMANGLE_COMPONENT_DTOR: + return d_find_pack (dpi, dc->u.s_dtor.name); + + default: + a = d_find_pack (dpi, d_left (dc)); + if (a) + return a; + return d_find_pack (dpi, d_right (dc)); + } +} + +/* Returns the length of the template argument pack DC. */ + +static int +d_pack_length (const struct demangle_component *dc) +{ + int count = 0; + while (dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST + && d_left (dc) != NULL) + { + ++count; + dc = d_right (dc); + } + return count; +} + +/* DC is a component of a mangled expression. Print it, wrapped in parens + if needed. */ + +static void +d_print_subexpr (struct d_print_info *dpi, + const struct demangle_component *dc) +{ + int simple = 0; + if (dc->type == DEMANGLE_COMPONENT_NAME) + simple = 1; + if (!simple) + d_append_char (dpi, '('); + d_print_comp (dpi, dc); + if (!simple) + d_append_char (dpi, ')'); +} + /* Subroutine to handle components. */ static void @@ -3147,30 +3431,13 @@ d_print_comp (struct d_print_info *dpi, case DEMANGLE_COMPONENT_TEMPLATE_PARAM: { - long i; - struct demangle_component *a; struct d_print_template *hold_dpt; + struct demangle_component *a = d_lookup_template_argument (dpi, dc); - if (dpi->templates == NULL) - { - d_print_error (dpi); - return; - } - i = dc->u.s_number.number; - for (a = d_right (dpi->templates->template_decl); - a != NULL; - a = d_right (a)) - { - if (a->type != DEMANGLE_COMPONENT_TEMPLATE_ARGLIST) - { - d_print_error (dpi); - return; - } - if (i <= 0) - break; - --i; - } - if (i != 0 || a == NULL) + if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST) + a = d_index_template_argument (a, dpi->pack_index); + + if (a == NULL) { d_print_error (dpi); return; @@ -3184,7 +3451,7 @@ d_print_comp (struct d_print_info *dpi, hold_dpt = dpi->templates; dpi->templates = hold_dpt->next; - d_print_comp (dpi, d_left (a)); + d_print_comp (dpi, a); dpi->templates = hold_dpt; @@ -3471,13 +3738,36 @@ d_print_comp (struct d_print_info *dpi, return; } + case DEMANGLE_COMPONENT_FIXED_TYPE: + if (dc->u.s_fixed.sat) + d_append_string (dpi, "_Sat "); + /* Don't print "int _Accum". */ + if (dc->u.s_fixed.length->u.s_builtin.type + != &cplus_demangle_builtin_types['i'-'a']) + { + d_print_comp (dpi, dc->u.s_fixed.length); + d_append_char (dpi, ' '); + } + if (dc->u.s_fixed.accum) + d_append_string (dpi, "_Accum"); + else + d_append_string (dpi, "_Fract"); + return; + case DEMANGLE_COMPONENT_ARGLIST: case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST: - d_print_comp (dpi, d_left (dc)); + if (d_left (dc) != NULL) + d_print_comp (dpi, d_left (dc)); if (d_right (dc) != NULL) { + size_t len; d_append_string (dpi, ", "); + len = dpi->len; d_print_comp (dpi, d_right (dc)); + /* If that didn't print anything (which can happen with empty + template argument packs), remove the comma and space. */ + if (dpi->len == len) + dpi->len -= 2; } return; @@ -3513,9 +3803,7 @@ d_print_comp (struct d_print_info *dpi, d_print_cast (dpi, d_left (dc)); d_append_char (dpi, ')'); } - d_append_char (dpi, '('); - d_print_comp (dpi, d_right (dc)); - d_append_char (dpi, ')'); + d_print_subexpr (dpi, d_right (dc)); return; case DEMANGLE_COMPONENT_BINARY: @@ -3533,13 +3821,10 @@ d_print_comp (struct d_print_info *dpi, && d_left (dc)->u.s_operator.op->name[0] == '>') d_append_char (dpi, '('); - d_append_char (dpi, '('); - d_print_comp (dpi, d_left (d_right (dc))); - d_append_string (dpi, ") "); - d_print_expr_op (dpi, d_left (dc)); - d_append_string (dpi, " ("); - d_print_comp (dpi, d_right (d_right (dc))); - d_append_char (dpi, ')'); + d_print_subexpr (dpi, d_left (d_right (dc))); + if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") != 0) + d_print_expr_op (dpi, d_left (dc)); + d_print_subexpr (dpi, d_right (d_right (dc))); if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR && d_left (dc)->u.s_operator.op->len == 1 @@ -3560,15 +3845,11 @@ d_print_comp (struct d_print_info *dpi, d_print_error (dpi); return; } - d_append_char (dpi, '('); - d_print_comp (dpi, d_left (d_right (dc))); - d_append_string (dpi, ") "); + d_print_subexpr (dpi, d_left (d_right (dc))); d_print_expr_op (dpi, d_left (dc)); - d_append_string (dpi, " ("); - d_print_comp (dpi, d_left (d_right (d_right (dc)))); - d_append_string (dpi, ") : ("); - d_print_comp (dpi, d_right (d_right (d_right (dc)))); - d_append_char (dpi, ')'); + d_print_subexpr (dpi, d_left (d_right (d_right (dc)))); + d_append_string (dpi, " : "); + d_print_subexpr (dpi, d_right (d_right (d_right (dc)))); return; case DEMANGLE_COMPONENT_TRINARY_ARG1: @@ -3675,6 +3956,29 @@ d_print_comp (struct d_print_info *dpi, d_append_char (dpi, dc->u.s_character.character); return; + case DEMANGLE_COMPONENT_DECLTYPE: + d_append_string (dpi, "decltype ("); + d_print_comp (dpi, d_left (dc)); + d_append_char (dpi, ')'); + return; + + case DEMANGLE_COMPONENT_PACK_EXPANSION: + { + struct demangle_component *a = d_find_pack (dpi, d_left (dc)); + int len = d_pack_length (a); + int i; + + dc = d_left (dc); + for (i = 0; i < len; ++i) + { + dpi->pack_index = i; + d_print_comp (dpi, dc); + if (i < len-1) + d_append_string (dpi, ", "); + } + } + return; + default: d_print_error (dpi); return; diff --git a/cp-demangle.h b/cp-demangle.h index 8622f29..aad3743 100644 --- a/cp-demangle.h +++ b/cp-demangle.h @@ -147,7 +147,7 @@ struct d_info extern const struct demangle_operator_info cplus_demangle_operators[]; #endif -#define D_BUILTIN_TYPE_COUNT (26) +#define D_BUILTIN_TYPE_COUNT (32) CP_STATIC_IF_GLIBCPP_V3 const struct demangle_builtin_type_info diff --git a/cplus-dem.c b/cplus-dem.c index 64d1125..6838d8c 100644 --- a/cplus-dem.c +++ b/cplus-dem.c @@ -133,7 +133,7 @@ static char *ada_demangle (const char *, int); that will be output when using the `%d' format with `printf'. */ #define INTBUF_SIZE 32 -extern void fancy_abort (void) ATTRIBUTE_NORETURN; +extern void fancy_abort (void); /* In order to allow a single demangler executable to demangle strings using various common values of CPLUS_MARKER, as well as any specific @@ -968,7 +968,7 @@ grow_vect (char **old_vect, size_t *size, size_t min_size, int element_size) The resulting string is valid until the next call of ada_demangle. */ static char * -ada_demangle (const char *mangled, int option ATTRIBUTE_UNUSED) +ada_demangle (const char *mangled, int option) { int i, j; int len0; @@ -3950,7 +3950,7 @@ demangle_fund_type (struct work_stuff *work, **mangled points to 'S' or 'U' */ static int -do_hpacc_template_const_value (struct work_stuff *work ATTRIBUTE_UNUSED, +do_hpacc_template_const_value (struct work_stuff *work, const char **mangled, string *result) { int unsigned_const; diff --git a/demangle.h b/demangle.h index bfeba0a..dea47d5 100644 --- a/demangle.h +++ b/demangle.h @@ -34,14 +34,33 @@ extern "C" { #endif /* __cplusplus */ -#define ATTRIBUTE_NORETURN -#define ATTRIBUTE_UNUSED -#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0])) + +/* These macros provide a K&R/C89/C++-friendly way of allocating structures + with nice encapsulation. The XDELETE*() macros are technically + superfluous, but provided here for symmetry. Using them consistently + makes it easier to update client code to use different allocators such + as new/delete and new[]/delete[]. */ + +/* Scalar allocators. */ + #define XNEW(T) ((T *) xmalloc (sizeof (T))) +#define XCNEW(T) ((T *) xcalloc (1, sizeof (T))) +#define XDELETE(P) free ((void*) (P)) + +/* Array allocators. */ + #define XNEWVEC(T, N) ((T *) xmalloc (sizeof (T) * (N))) -#define XRESIZEVAR(T, P, S) ((T *) xrealloc ((P), (S))) +#define XCNEWVEC(T, N) ((T *) xcalloc ((N), sizeof (T))) #define XRESIZEVEC(T, P, N) ((T *) xrealloc ((void *) (P), sizeof (T) * (N))) +#define XDELETEVEC(P) free ((void*) (P)) +/* Allocators for variable-sized structures and raw buffers. */ + +#define XNEWVAR(T, S) ((T *) xmalloc ((S))) +#define XCNEWVAR(T, S) ((T *) xcalloc (1, (S))) +#define XRESIZEVAR(T, P, S) ((T *) xrealloc ((P), (S))) + +#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0])) /* Options passed to cplus_demangle (in 2nd parameter). */ @@ -326,6 +345,8 @@ enum demangle_component_type and the right subtree is the member type. CV-qualifiers appear on the latter. */ DEMANGLE_COMPONENT_PTRMEM_TYPE, + /* A fixed-point type. */ + DEMANGLE_COMPONENT_FIXED_TYPE, /* An argument list. The left subtree is the current argument, and the right subtree is either NULL or another ARGLIST node. */ DEMANGLE_COMPONENT_ARGLIST, @@ -377,7 +398,11 @@ enum demangle_component_type subtree is the first part and the right subtree the second. */ DEMANGLE_COMPONENT_COMPOUND_NAME, /* A name formed by a single character. */ - DEMANGLE_COMPONENT_CHARACTER + DEMANGLE_COMPONENT_CHARACTER, + /* A decltype type. */ + DEMANGLE_COMPONENT_DECLTYPE, + /* A pack expansion. */ + DEMANGLE_COMPONENT_PACK_EXPANSION }; /* Types which are only used internally. */ @@ -422,6 +447,17 @@ struct demangle_component struct demangle_component *name; } s_extended_operator; + /* For DEMANGLE_COMPONENT_FIXED_TYPE. */ + struct + { + /* The length, indicated by a C integer type name. */ + struct demangle_component *length; + /* _Accum or _Fract? */ + short accum; + /* Saturating or not? */ + short sat; + } s_fixed; + /* For DEMANGLE_COMPONENT_CTOR. */ struct { diff --git a/output/out.cc b/output/out.cc index dd01e50..24231f2 100644 --- a/output/out.cc +++ b/output/out.cc @@ -281,7 +281,7 @@ void AnalyserOutput::generateAddr(Address *Addr, OutAddr *oa) char buf3[90]; sprintf(buf3, " %c", xref_type_short(x->type)); write(buf3); - x->addr->stringify(buf3, 1024, ADDRESS_STRING_FORMAT_COMPACT); + x->addr->stringify(buf3, sizeof buf3, ADDRESS_STRING_FORMAT_COMPACT); write(link(buf3, x->addr)); xh = xr->findNext(xh); } else { @@ -554,7 +554,7 @@ void AnalyserOutput::generatePage(Address *from, int lines) OutAddr *AnalyserOutput::getAddr(Address *Addr) { char tbuf[1024]; - Addr->stringify(tbuf, 1024, 0); + Addr->stringify(tbuf, sizeof tbuf, 0); DPRINTF("%s -- ",tbuf); if (!addr->isValid() || Addr->compareTo(addr) != 0) { assert(addr != Addr); From 82ceb1d219fe28e4a30e7521181633cce06d8188 Mon Sep 17 00:00:00 2001 From: seppel Date: Sun, 1 Feb 2009 01:28:59 +0000 Subject: [PATCH 04/53] . --- analyser/language.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/analyser/language.cc b/analyser/language.cc index fbb769c..204cf33 100644 --- a/analyser/language.cc +++ b/analyser/language.cc @@ -101,7 +101,7 @@ int analy_string__raw_test(const byte *s, int len) int average_word_len = all_word_len / words; int av_res[10] = {1, 2, 4, 8, 16, 16, 10, 8, 6, 3}; int av_plus = 0; - if (average_word_len > 1 && average_word_len < 13) av_plus = av_res[average_word_len - 2]; + if (average_word_len > 1 && average_word_len < 12) av_plus = av_res[average_word_len - 2]; return words*2 + av_plus - bad_chars*5 + len/5 + average_word_len; } From d9b32957d4f5fac8b8740a25dd4c0ea25e0e9cac Mon Sep 17 00:00:00 2001 From: seppel Date: Wed, 4 Feb 2009 22:49:01 +0000 Subject: [PATCH 05/53] . --- asm/x86opc.cc | 230 +++++++++++++++++++++++++++++++------------------- configure.in | 2 +- doc/ht.texi | 6 +- htinfo.h | 4 +- 4 files changed, 151 insertions(+), 91 deletions(-) diff --git a/asm/x86opc.cc b/asm/x86opc.cc index b4ec962..f5018d1 100644 --- a/asm/x86opc.cc +++ b/asm/x86opc.cc @@ -3399,13 +3399,13 @@ E(10) {"vmovss", _128|_f3|_0f, {Vo, VVo, Wd}}, //{"vmovsd", _128|_f2|_0f, {Vo, VVo, VRo}}, {"vmovsd", _128|_f2|_0f, {Vo, VVo, Wq}}, -{"vmovupd", _128|_0f, {Vo, Wo}}, -{"vmovupd", _256|_0f, {Yy, Xy}}, +{"vmovups", _128|_0f, {Vo, Wo}}, +{"vmovups", _256|_0f, {Yy, Xy}}, {"vmovupd", _128|_66|_0f, {Vo, Wo}}, {"vmovupd", _256|_66|_0f, {Yy, Xy}}, E(11) -//{"vmovss", _128|_f2|_0f, {VRo, VVo, Vo}}, -{"vmovss", _128|_f2|_0f, {Wd, VVo, Vo}}, +//{"vmovss", _128|_f3|_0f, {VRo, VVo, Vo}}, +{"vmovss", _128|_f3|_0f, {Wd, VVo, Vo}}, //{"vmovsd", _128|_f2|_0f, {VRo, VVo, Vo}}, {"vmovsd", _128|_f2|_0f, {Wq, VVo, Vo}}, {"vmovups", _128|_0f, {Wo, Vo}}, @@ -3497,7 +3497,9 @@ E(2a) {"vcvtsi2sd", _128|_f2|_0f|W1, {Vo, VVo, Eq}}, E(2b) {"vmovntps", _128|_0f, {Mo, Vo}}, +{"vmovntps", _256|_0f, {My, Xy}}, {"vmovntpd", _128|_66|_0f, {Mo, Vo}}, +{"vmovntpd", _256|_66|_0f, {My, Xy}}, {"vpackusdw", _128|_66|_0f38, {Vo, VVo, Wo}}, E(2c) {"vmaskmovps", _128|_66|_0f38, {Vo, VVo, Mo}}, @@ -3562,6 +3564,9 @@ E(41) {"vphminposuw", _128|_66|_0f38, {Vo, Wo}}, E(42) {"vmpsadbw", _128|_66|_0f3a, {Vo, VVo, Wo, Ib}}, +E(44) +{"vpclmulqdq", _128|_66|_0f3a, {Vo, VVo, Wo, Ib}}, +/* E(48) {"vpermil2ps", _128|_66|_0f3a|W0, {Vo, VVo, Wo, VIo, I4}}, {"vpermil2ps", _128|_66|_0f3a|W1, {Vo, VVo, VIo, Wo, I4}}, @@ -3572,6 +3577,7 @@ E(49) {"vpermil2pd", _128|_66|_0f3a|W1, {Vo, VVo, VIo, Wo, I4}}, {"vpermil2pd", _256|_66|_0f3a|W0, {Yy, YVy, Xy, YIy, I4}}, {"vpermil2pd", _256|_66|_0f3a|W1, {Yy, YVy, YIy, Xy, I4}}, +*/ E(4a) {"vblendvps", _128|_66|_0f3a, {Vo, VVo, Wo, VIo}}, {"vblendvps", _256|_66|_0f3a, {Yy, YVy, Xy, YIy}}, @@ -3594,14 +3600,10 @@ E(51) {"vsqrtsd", _128|_f2|_0f, {Vo, Wo}}, E(52) {"vrsqrtps", _128|_0f, {Vo, Wo}}, -{"vrsqrtps", _256|_0f, {Yy, Xy}}, {"vrsqrtss", _128|_f3|_0f, {Vo, Wo}}, -{"vrsqrtss", _256|_f3|_0f, {Yy, Xy}}, E(53) {"vrcpps", _128|_0f, {Vo, Wo}}, -{"vrcpps", _256|_0f, {Yy, Xy}}, {"vrcpss", _128|_f3|_0f, {Vo, Wo}}, -{"vrcpss", _256|_f3|_0f, {Yy, Xy}}, E(54) {"vandps", _128|_0f, {Vo, VVo, Wo}}, {"vandps", _256|_0f, {Yy, YVy, Xy}}, @@ -3657,10 +3659,6 @@ E(5c) {"vsubpd", _256|_66|_0f, {Yy, YVy, Xy}}, {"vsubss", _128|_f2|_0f, {Vo, VVo, Wo}}, {"vsubsd", _128|_f3|_0f, {Vo, VVo, Wo}}, -{"vfmaddsubps", _128|_66|_0f3a|W0, {Vo, VIo, Wo, VVo}}, -{"vfmaddsubps", _128|_66|_0f3a|W1, {Vo, VIo, VVo, Wo}}, -{"vfmaddsubps", _256|_66|_0f3a|W0, {Yy, YIy, Xy, YVy}}, -{"vfmaddsubps", _256|_66|_0f3a|W1, {Yy, YIy, YVy, Xy}}, E(5d) {"vminps", _128|_0f, {Vo, VVo, Wo}}, {"vminps", _256|_0f, {Yy, YVy, Xy}}, @@ -3668,10 +3666,6 @@ E(5d) {"vminpd", _256|_66|_0f, {Yy, YVy, Xy}}, {"vminss", _128|_f2|_0f, {Vo, VVo, Wo}}, {"vminsd", _128|_f3|_0f, {Vo, VVo, Wo}}, -{"vfmaddsubpd", _128|_66|_0f3a|W0, {Vo, VIo, Wo, VVo}}, -{"vfmaddsubpd", _128|_66|_0f3a|W1, {Vo, VIo, VVo, Wo}}, -{"vfmaddsubpd", _256|_66|_0f3a|W0, {Yy, YIy, Xy, YVy}}, -{"vfmaddsubpd", _256|_66|_0f3a|W1, {Yy, YIy, YVy, Xy}}, E(5e) {"vdivps", _128|_0f, {Vo, VVo, Wo}}, {"vdivps", _256|_0f, {Yy, YVy, Xy}}, @@ -3679,10 +3673,6 @@ E(5e) {"vdivpd", _256|_66|_0f, {Yy, YVy, Xy}}, {"vdivss", _128|_f2|_0f, {Vo, VVo, Wo}}, {"vdivsd", _128|_f3|_0f, {Vo, VVo, Wo}}, -{"vfmsubaddps", _128|_66|_0f3a|W0, {Vo, VIo, Wo, VVo}}, -{"vfmsubaddps", _128|_66|_0f3a|W1, {Vo, VIo, VVo, Wo}}, -{"vfmsubaddps", _256|_66|_0f3a|W0, {Yy, YIy, Xy, YVy}}, -{"vfmsubaddps", _256|_66|_0f3a|W1, {Yy, YIy, YVy, Xy}}, E(5f) {"vmaxps", _128|_0f, {Vo, VVo, Wo}}, {"vmaxps", _256|_0f, {Yy, YVy, Xy}}, @@ -3690,10 +3680,6 @@ E(5f) {"vmaxpd", _256|_66|_0f, {Yy, YVy, Xy}}, {"vmaxss", _128|_f2|_0f, {Vo, VVo, Wo}}, {"vmaxsd", _128|_f3|_0f, {Vo, VVo, Wo}}, -{"vfmsubaddpd", _128|_66|_0f3a|W0, {Vo, VIo, Wo, VVo}}, -{"vfmsubaddpd", _128|_66|_0f3a|W1, {Vo, VIo, VVo, Wo}}, -{"vfmsubaddpd", _256|_66|_0f3a|W0, {Yy, YIy, Xy, YVy}}, -{"vfmsubaddpd", _256|_66|_0f3a|W1, {Yy, YIy, YVy, Xy}}, E(60) {"vpcmpestrm", _128|_66|_0f3a, {Vo, Wo, Ib}}, {"vpunpcklbw", _128|_66|_0f, {Vo, VVo, Wo}}, @@ -3716,48 +3702,24 @@ E(67) {"vpackuswb", _128|_66|_0f, {Vo, VVo, Wo}}, E(68) {"vpunpckhbw", _128|_66|_0f, {Vo, VVo, Wo}}, -{"vfmaddps", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, -{"vfmaddps", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, -{"vfmaddps", _256|_66|_0f3a|W0, {Yy, YIy, YVy, Xy}}, -{"vfmaddps", _256|_66|_0f3a|W1, {Yy, YIy, Xy, YVy}}, E(69) {"vpunpckhwd", _128|_66|_0f, {Vo, VVo, Wo}}, -{"vfmaddpd", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, -{"vfmaddpd", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, -{"vfmaddpd", _256|_66|_0f3a|W0, {Yy, YIy, YVy, Xy}}, -{"vfmaddpd", _256|_66|_0f3a|W1, {Yy, YIy, Xy, YVy}}, E(6a) {"vpunpckhdq", _128|_66|_0f, {Vo, VVo, Wo}}, -{"vfmaddss", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, -{"vfmaddss", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, E(6b) {"vpackssdw", _128|_66|_0f, {Vo, VVo, Wo}}, -{"vfmaddsd", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, -{"vfmaddsd", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, E(6c) {"vpunpcklqdq", _128|_66|_0f, {Vo, VVo, Wo}}, -{"vfmsubps", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, -{"vfmsubps", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, -{"vfmsubps", _256|_66|_0f3a|W0, {Yy, YIy, YVy, Xy}}, -{"vfmsubps", _256|_66|_0f3a|W1, {Yy, YIy, Xy, YVy}}, E(6d) {"vpunpckhqdq", _128|_66|_0f, {Vo, VVo, Wo}}, -{"vfmsubpd", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, -{"vfmsubpd", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, -{"vfmsubpd", _256|_66|_0f3a|W0, {Yy, YIy, YVy, Xy}}, -{"vfmsubpd", _256|_66|_0f3a|W1, {Yy, YIy, Xy, YVy}}, E(6e) {"vmovd", _128|_66|_0f|W0, {Vo, Ed}}, {"vmovq", _128|_66|_0f|W1, {Vo, Eq}}, -{"vfmsubss", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, -{"vfmsubss", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, E(6f) {"vmovdqa", _128|_66|_0f, {Vo, Wo}}, {"vmovdqa", _256|_66|_0f, {Yy, Xy}}, {"vmovdqu", _128|_f3|_0f, {Vo, Wo}}, {"vmovdqu", _256|_f3|_0f, {Yy, Xy}}, -{"vfmsubsd", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, -{"vfmsubsd", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, E(70) {"vpshufd", _128|_66|_0f, {Vo, Wo, Ib}}, {"vpshufhw", _128|_f3|_0f, {Vo, Wo, Ib}}, @@ -3777,27 +3739,7 @@ E(76) E(77) {"vzeroupper", _128|_0f}, {"vzeroall", _256|_0f}, -E(78) -{"vfnmaddps", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, -{"vfnmaddps", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, -{"vfnmaddps", _256|_66|_0f3a|W0, {Yy, YIy, YVy, Xy}}, -{"vfnmaddps", _256|_66|_0f3a|W1, {Yy, YIy, Xy, YVy}}, -E(79) -{"vfnmaddpd", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, -{"vfnmaddpd", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, -{"vfnmaddpd", _256|_66|_0f3a|W0, {Yy, YIy, YVy, Xy}}, -{"vfnmaddpd", _256|_66|_0f3a|W1, {Yy, YIy, Xy, YVy}}, -E(7a) -{"vfnmaddss", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, -{"vfnmaddss", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, -E(7b) -{"vfnmaddsd", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, -{"vfnmaddsd", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, E(7c) -{"vfnmsubps", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, -{"vfnmsubps", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, -{"vfnmsubps", _256|_66|_0f3a|W0, {Yy, YIy, YVy, Xy}}, -{"vfnmsubps", _256|_66|_0f3a|W1, {Yy, YIy, Xy, YVy}}, {"vhaddpd", _128|_66|_0f, {Vo, VVo, Wo}}, {"vhaddpd", _256|_66|_0f, {Yy, YVy, Xy}}, {"vhaddss", _128|_f2|_0f, {Vo, VVo, Wo}}, @@ -3807,13 +3749,7 @@ E(7d) {"vhsubpd", _256|_66|_0f, {Yy, YVy, Xy}}, {"vhsubss", _128|_f2|_0f, {Vo, VVo, Wo}}, {"vhsubss", _256|_f2|_0f, {Yy, YVy, Xy}}, -{"vfnmsubpd", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, -{"vfnmsubpd", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, -{"vfnmsubpd", _256|_66|_0f3a|W0, {Yy, YIy, YVy, Xy}}, -{"vfnmsubpd", _256|_66|_0f3a|W1, {Yy, YIy, Xy, YVy}}, E(7e) -{"vfnmsubss", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, -{"vfnmsubss", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, {"vmovd", _128|_66|_0f|W0, {Ed, Vo}}, {"vmovq", _128|_66|_0f|W1, {Eq, Vo}}, {"vmovq", _128|_f3|_0f, {Vo, Wq}}, @@ -3822,10 +3758,127 @@ E(7f) {"vmovdqa", _256|_66|_0f, {Xy, Yy}}, {"vmovdqu", _128|_f3|_0f, {Wo, Vo}}, {"vmovdqu", _256|_f3|_0f, {Xy, Yy}}, -{"vfnmsubsd", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, -{"vfnmsubsd", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, +E(96) +{"vfmaddsub132ps", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfmaddsub132ps", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, +{"vfmaddsub132pd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +{"vfmaddsub132pd", _256|_66|_0f38|W1, {Yy, YVy, Xy}}, +E(97) +{"vfmaddsub132ss", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfmaddsub132sd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +E(98) +{"vfmadd132ps", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfmadd132ps", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, +{"vfmadd132pd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +{"vfmadd132pd", _256|_66|_0f38|W1, {Yy, YVy, Xy}}, +E(99) +{"vfmadd132ss", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfmadd132sd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +E(9a) +{"vfmsub132ps", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfmsub132ps", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, +{"vfmsub132pd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +{"vfmsub132pd", _256|_66|_0f38|W1, {Yy, YVy, Xy}}, +E(9b) +{"vfmsub132ss", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfmsub132sd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +E(9c) +{"vfnmadd132ps", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfnmadd132ps", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, +{"vfnmadd132pd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +{"vfnmadd132pd", _256|_66|_0f38|W1, {Yy, YVy, Xy}}, +E(9d) +{"vfnmadd132ss", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfnmadd132sd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +E(9e) +{"vfnmsub132ps", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfnmsub132ps", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, +{"vfnmsub132pd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +{"vfnmsub132pd", _256|_66|_0f38|W1, {Yy, YVy, Xy}}, +E(9f) +{"vfnmsub132ss", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfnmsub132sd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +E(a6) +{"vfmaddsub213ps", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfmaddsub213ps", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, +{"vfmaddsub213pd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +{"vfmaddsub213pd", _256|_66|_0f38|W1, {Yy, YVy, Xy}}, +E(a7) +{"vfmaddsub213ss", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfmaddsub213sd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +E(a8) +{"vfmadd213ps", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfmadd213ps", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, +{"vfmadd213pd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +{"vfmadd213pd", _256|_66|_0f38|W1, {Yy, YVy, Xy}}, +E(a9) +{"vfmadd213ss", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfmadd213sd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +E(aa) +{"vfmsub213ps", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfmsub213ps", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, +{"vfmsub213pd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +{"vfmsub213pd", _256|_66|_0f38|W1, {Yy, YVy, Xy}}, +E(ab) +{"vfmsub213ss", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfmsub213sd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +E(ac) +{"vfnmadd213ps", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfnmadd213ps", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, +{"vfnmadd213pd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +{"vfnmadd213pd", _256|_66|_0f38|W1, {Yy, YVy, Xy}}, +E(ad) +{"vfnmadd213ss", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfnmadd213sd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, E(ae) {0, _0f, {SPECIAL_TYPE_GROUP, GROUP_0FAE}}, +{"vfnmsub213ps", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfnmsub213ps", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, +{"vfnmsub213pd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +{"vfnmsub213pd", _256|_66|_0f38|W1, {Yy, YVy, Xy}}, +E(af) +{"vfnmsub213ss", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfnmsub213sd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +E(b6) +{"vfmaddsub231ps", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfmaddsub231ps", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, +{"vfmaddsub231pd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +{"vfmaddsub231pd", _256|_66|_0f38|W1, {Yy, YVy, Xy}}, +E(b7) +{"vfmaddsub231ss", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfmaddsub231sd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +E(b8) +{"vfmadd231ps", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfmadd231ps", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, +{"vfmadd231pd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +{"vfmadd231pd", _256|_66|_0f38|W1, {Yy, YVy, Xy}}, +E(b9) +{"vfmadd231ss", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfmadd231sd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +E(ba) +{"vfmsub231ps", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfmsub231ps", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, +{"vfmsub231pd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +{"vfmsub231pd", _256|_66|_0f38|W1, {Yy, YVy, Xy}}, +E(bb) +{"vfmsub231ss", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfmsub231sd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +E(bc) +{"vfnmadd231ps", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfnmadd231ps", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, +{"vfnmadd231pd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +{"vfnmadd231pd", _256|_66|_0f38|W1, {Yy, YVy, Xy}}, +E(bd) +{"vfnmadd231ss", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfnmadd231sd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +E(be) +{"vfnmsub231ps", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfnmsub231ps", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, +{"vfnmsub231pd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +{"vfnmsub231pd", _256|_66|_0f38|W1, {Yy, YVy, Xy}}, +E(bf) +{"vfnmsub231ss", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vfnmsub231sd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, E(c2) {"vcmpps", _128|_0f, {Vo, VVo, Wo, Ib}}, {"vcmpps", _256|_0f, {Yy, YVy, Xy, Ib}}, @@ -3869,14 +3922,20 @@ E(da) {"vpminub", _128|_66|_0f, {Vo, VVo, Wo}}, E(db) {"vpand", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vaesimc", _128|_66|_0f38, {Vo, Wo}}, E(dc) {"vpaddusb", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vaesenc", _128|_66|_0f38, {Vo, VVo, Wo}}, E(dd) {"vpaddusw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vaesenclast", _128|_66|_0f38, {Vo, VVo, Wo}}, E(de) {"vpmaxub", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vaesdec", _128|_66|_0f38, {Vo, VVo, Wo}}, E(df) {"vpandn", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vaesdeclast", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vaeskeygenassist", _128|_66|_0f3a, {Vo, Wo, Ib}}, E(e0) {"vpavgb", _128|_66|_0f, {Vo, VVo, Wo}}, E(e1) @@ -3898,6 +3957,7 @@ E(e6) {"vcvttpd2dq", _256|_66|_0f, {Yy, Xy}}, E(e7) {"vmovntdq", _128|_66|_0f, {Mo, Vo}}, +{"vmovntdq", _256|_66|_0f, {My, Yy}}, E(e8) {"vpsubsb", _128|_66|_0f, {Vo, VVo, Wo}}, E(e9) @@ -4003,22 +4063,22 @@ v20, v21, v22, v23, v24, v25, 0, 0, v28, v29, v2a, v2b, v2c, v2d, v2e, v2f, v30, v31, v32, v33, v34, v35, 0, v37, v38, v39, v3a, v3b, v3c, v3d, v3e, v3f, -v40, v41, v42, 0, 0, 0, 0, 0, -v48, v49, v4a, v4b, v4c, 0, 0, 0, +v40, v41, v42, 0, v44, 0, 0, 0, + 0, 0, v4a, v4b, v4c, 0, 0, 0, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v5a, v5b, v5c, v5d, v5e, v5f, v60, v61, v62, v63, v64, v65, v66, v67, v68, v69, v6a, v6b, v6c, v6d, v6e, v6f, v70, v71, v72, v73, v74, v75, v76, v77, -v78, v79, v7a, v7b, v7c, v7d, v7e, v7f, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, vae, 0, + 0, 0, 0, 0, v7c, v7d, v7e, v7f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, v96, v97, +v98, v99, v9a, v9b, v9c, v9d, v9e, v9f, + 0, 0, 0, 0, 0, 0, va6, va7, +va8, va9, vaa, vab, vac, vad, vae, vaf, + 0, 0, 0, 0, 0, 0, vb6, vb7, +vb8, vb9, vba, vbb, vbc, vbd, vbe, vbf, 0, 0, vc2, 0, vc4, vc5, vc6, 0, 0, 0, 0, 0, 0, 0, 0, 0, vd0, vd1, vd2, vd3, vd4, vd5, vd6, vd7, diff --git a/configure.in b/configure.in index 7599b79..17d303f 100644 --- a/configure.in +++ b/configure.in @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. -AC_INIT(ht,[2.0.15],[https://sourceforge.net/tracker/?group_id=1066]) +AC_INIT(ht,[2.0.16],[https://sourceforge.net/tracker/?group_id=1066]) AC_PREREQ(2.59) dnl Check the system. diff --git a/doc/ht.texi b/doc/ht.texi index 8f942c4..49c6c6e 100644 --- a/doc/ht.texi +++ b/doc/ht.texi @@ -23,7 +23,7 @@ END-INFO-DIR-ENTRY This file documents the HT Editor. @c -Copyright @copyright{} 1999-2008 The HT authors. @* +Copyright @copyright{} 1999-2009 The HT authors. @* @xref{Authors, The HT Authors, The HT Authors}, for a list of the copyright holders. @@ -51,14 +51,14 @@ be registered in certain jurisdictions. @titlepage @title{HT Manual} -@subtitle{Edition 2.0.15, May 2008} +@subtitle{Edition 2.0.16, May 2008} @author{Stefan Weyergraf, Sebastian Biallas} @c The following two commands start the copyright page. @page @vskip 0pt plus 1filll -Copyright @copyright{} 1999-2008 The HT authors. @* +Copyright @copyright{} 1999-2009 The HT authors. @* @xref{Authors, The HT Authors, The HT Authors}, for a list of the copyright holders. diff --git a/htinfo.h b/htinfo.h index 69ab07a..0060bec 100644 --- a/htinfo.h +++ b/htinfo.h @@ -24,13 +24,13 @@ #define ht_url "http://hte.sourceforge.net" #define ht_name "ht" -#define ht_version "2.0.15" +#define ht_version "2.0.16" #define ht_author1 "Stefan Weyergraf" #define ht_copyright1 "(c) 1999-2004 "ht_author1 #define ht_author2 "Sebastian Biallas" #define ht_mail2 "sb@biallas.net" -#define ht_copyright2 "(c) 1999-2008 "ht_author2" <"ht_mail2">" +#define ht_copyright2 "(c) 1999-2009 "ht_author2" <"ht_mail2">" #endif /* !__HTINFO_H__ */ From 51ceb57807529d3b813bc031b37240b51c5e507e Mon Sep 17 00:00:00 2001 From: seppel Date: Mon, 6 Apr 2009 23:42:11 +0000 Subject: [PATCH 06/53] . --- ChangeLog | 3 +++ htapp.cc | 2 +- htformat.cc | 2 +- htreg.cc | 2 +- httag.cc | 2 +- httag.h | 2 +- httext.cc | 7 ++++--- info/infoview.cc | 8 ++++---- io/file.cc | 10 +++++----- io/file.h | 2 +- 10 files changed, 22 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index bc2ea7a..664e1ac 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,9 @@ HT ChangeLog ============== +version 2.0.17: + - compilation fixes for gcc 4.4 + version 2.0.16: - [x86] intel avx update - updated c++ demangler diff --git a/htapp.cc b/htapp.cc index 724fb4d..6d57805 100644 --- a/htapp.cc +++ b/htapp.cc @@ -2962,7 +2962,7 @@ void ht_app::project_opencreate(const char *filename) LOG("%s: invalid filename", filename); return; } - char *suf = sys_filename_suffix(fn); + const char *suf = sys_filename_suffix(fn); /* append HT project file suffix if not already there */ if (!(suf && (strcmp(suf, HT_PROJECT_CONFIG_SUFFIX+1)==0))) { strcat(fn, HT_PROJECT_CONFIG_SUFFIX); diff --git a/htformat.cc b/htformat.cc index a088484..bc4e4a4 100644 --- a/htformat.cc +++ b/htformat.cc @@ -3916,7 +3916,7 @@ void ht_uformat_viewer::update_misc_info() void ht_uformat_viewer::update_visual_info() { cursorline_get(); - char *s, *t = cursor_line; + const char *s, *t = cursor_line; int v = 0, vl = 0; int i = 0, g = 0; while ((s=tag_findnext(t))) { diff --git a/htreg.cc b/htreg.cc index c0b1d08..ba142dc 100644 --- a/htreg.cc +++ b/htreg.cc @@ -781,7 +781,7 @@ bool ht_registry::find_data_entry(const char *key, ht_registry_node **node, bool ht_registry_node *ht_registry::find_entry_i(Container **rdir, const char *key, bool follow_symlinks) { ht_registry_node *dir = root; - char *s; + const char *s; char t[256]; /* FIXME: possible buffer overflow */ if (key[0]=='/') key++; while (1) { diff --git a/httag.cc b/httag.cc index 23794b9..7c5ce68 100644 --- a/httag.cc +++ b/httag.cc @@ -537,7 +537,7 @@ void statictag_to_tag(const char *statictag_str, TAGSTRING *tag_str, int maxlen, *tag_str = 0; } -TAGSTRING *tag_findnext(const TAGSTRING *tagstring) +const TAGSTRING *tag_findnext(const TAGSTRING *tagstring) { return strchr(tagstring, '\e'); } diff --git a/httag.h b/httag.h index f972607..9ea361f 100644 --- a/httag.h +++ b/httag.h @@ -447,7 +447,7 @@ typedef char TAGSTRING; void statictag_to_tag(const char *statictag_str, TAGSTRING *tag_str, int maxlen, uint64 relocation, bool std_bigendian); -TAGSTRING *tag_findnext(const TAGSTRING *tagstring); +const TAGSTRING *tag_findnext(const TAGSTRING *tagstring); vcp tag_get_color(const TAGSTRING *tagstring); void tag_get_id(const TAGSTRING *tagstring, uint32 *id128_1, uint32 *id128_2, uint32 *id128_3, uint32 *id128_4); diff --git a/httext.cc b/httext.cc index 006d448..b6c7257 100644 --- a/httext.cc +++ b/httext.cc @@ -1,4 +1,5 @@ /* + * HT Editor * httext.cc * @@ -103,10 +104,10 @@ void ht_text_viewer2::handlemsg(htmsg *msg) */ /* FIXME: put it somewhere else..., why ain't this a POSIX function ? */ -void *memrchr(const void *string, int ch, size_t num) +const void *ht_memrchr(const void *string, int ch, size_t num) { while (num--) { - if (((char*)string)[num]==ch) return ((char*)string)+num; + if (((const char*)string)[num]==ch) return ((const char*)string)+num; } return NULL; } @@ -286,7 +287,7 @@ byte *ht_text_sub::match_lineend_backwd(byte *buf, uint buflen, int *le_len) { byte *result=NULL; - byte *n=(byte*)memrchr(buf, '\n', buflen); + byte *n=(byte*)ht_memrchr(buf, '\n', buflen); if (n) { if ((n>buf) && (n[-1] == '\r')) { *le_len=2; diff --git a/info/infoview.cc b/info/infoview.cc index faf10b9..02c3dd7 100644 --- a/info/infoview.cc +++ b/info/infoview.cc @@ -193,7 +193,7 @@ Container *parse_info_node(File *fl, const char *infotext) } else { fallback: if (k && k > n) { - char *cr = strchr(n, '\n'); + const char *cr = strchr(n, '\n'); if (cr && cr < k) k = cr; if (k-n == 0) goto fallback2; fl->write(n, k-n); @@ -423,11 +423,11 @@ int ht_info_viewer::find_node(const char *infotext, const char *node) const char *tags[] = {"File", "Node", "Prev", "Next", "Up"}; #define NUM_NODE_TAGS (sizeof (tags) / sizeof (tags[0])) const char *s = infotext; - char *firstnode = NULL; + const char *firstnode = NULL; while ((s=strchr(s, 0x1f))) { s++; while ((*s>0) && (*s<32)) s++; - char *cr = strchr(s, '\n'); + const char *cr = strchr(s, '\n'); if (cr) { while (*s && (scr)) e = cr; if (!firstnode && (strcmp(tags[i], "Node") == 0)) { firstnode = cr+1; diff --git a/io/file.cc b/io/file.cc index 2fceffc..c57fde0 100755 --- a/io/file.cc +++ b/io/file.cc @@ -210,9 +210,9 @@ static char *_env_replace(char *str, unsigned int len) int sys_basename(char *result, const char *filename) { // FIXME: use is_path_delim - char *slash1 = strrchr(filename, '/'); - char *slash2 = strrchr(filename, '\\'); - char *slash = (slash1 > slash2) ? slash1 : slash2; + const char *slash1 = strrchr(filename, '/'); + const char *slash2 = strrchr(filename, '\\'); + const char *slash = (slash1 > slash2) ? slash1 : slash2; if (slash) { int l = strlen(filename); ht_strlcpy(result, slash+1, l-(slash-filename)+1); @@ -395,14 +395,14 @@ int sys_common_canonicalize(char *result, const char *filename, const char *cwd, return (k == 0) ? 0 : EINVAL; } -char *sys_filename_suffix(const char *fn) +const char *sys_filename_suffix(const char *fn) { const char *s = NULL; while (fn && *fn) { if (sys_is_path_delim(*fn)) s = fn+1; fn++; } - char *p = s ? strrchr(s, '.') : NULL; + const char *p = s ? strrchr(s, '.') : NULL; return p ? p+1 : NULL; } diff --git a/io/file.h b/io/file.h index 94da583..13e82ce 100644 --- a/io/file.h +++ b/io/file.h @@ -154,7 +154,7 @@ char * sys_dirname(char *path); char * sys_get_home_dir(); int sys_relname(char *result, const char *filename, const char *cwd); int sys_common_canonicalize(char *result, const char *in_name, const char *cwd, is_path_delim delim); -char * sys_filename_suffix(const char *fn); +const char * sys_filename_suffix(const char *fn); int sys_tmpfile_fd(); /* system-dependant (implementation in $MYSYSTEM/ *.cc) */ From 3ee5e45425c309d509060152f876031d6e15128e Mon Sep 17 00:00:00 2001 From: seppel Date: Mon, 6 Apr 2009 23:47:59 +0000 Subject: [PATCH 07/53] . --- configure.in | 2 +- doc/ht.texi | 4 ++-- htinfo.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/configure.in b/configure.in index 17d303f..5b78ebf 100644 --- a/configure.in +++ b/configure.in @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. -AC_INIT(ht,[2.0.16],[https://sourceforge.net/tracker/?group_id=1066]) +AC_INIT(ht,[2.0.17],[https://sourceforge.net/tracker/?group_id=1066]) AC_PREREQ(2.59) dnl Check the system. diff --git a/doc/ht.texi b/doc/ht.texi index 49c6c6e..d040786 100644 --- a/doc/ht.texi +++ b/doc/ht.texi @@ -51,7 +51,7 @@ be registered in certain jurisdictions. @titlepage @title{HT Manual} -@subtitle{Edition 2.0.16, May 2008} +@subtitle{Edition 2.0.17, May 2008} @author{Stefan Weyergraf, Sebastian Biallas} @c The following two commands start the copyright page. @@ -78,7 +78,7 @@ be registered in certain jurisdictions. @c @macro htversion -2.0.15 +2.0.17 @end macro @macro hturl diff --git a/htinfo.h b/htinfo.h index 0060bec..fb55ac3 100644 --- a/htinfo.h +++ b/htinfo.h @@ -24,7 +24,7 @@ #define ht_url "http://hte.sourceforge.net" #define ht_name "ht" -#define ht_version "2.0.16" +#define ht_version "2.0.17" #define ht_author1 "Stefan Weyergraf" #define ht_copyright1 "(c) 1999-2004 "ht_author1 From 7133c2ee20b3938ed32f261362a59784f03c8eda Mon Sep 17 00:00:00 2001 From: seppel Date: Fri, 17 Apr 2009 22:40:08 +0000 Subject: [PATCH 08/53] . --- ChangeLog | 1 + htelf.cc | 2 +- htelfshs.cc | 20 ++++++++++++-------- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 664e1ac..92bcd0a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,7 @@ version 2.0.17: - compilation fixes for gcc 4.4 + - fixed crash on garbage in elf section headers version 2.0.16: - [x86] intel avx update diff --git a/htelf.cc b/htelf.cc index 543a6eb..19500f2 100644 --- a/htelf.cc +++ b/htelf.cc @@ -422,7 +422,7 @@ void ht_elf::auto_relocate32() } /* relocate sections */ - for (uint i=0; isheaders.count; i++) { + for (uint i=0; i < elf_shared->sheaders.count; i++) { elf_shared->shrelocs[i].relocAddr = 0; if ((s[i].sh_type == ELF_SHT_PROGBITS) && (s[i].sh_addr == 0)) { uint j = find_reloc_section_for(i); diff --git a/htelfshs.cc b/htelfshs.cc index d643f24..e296ea5 100644 --- a/htelfshs.cc +++ b/htelfshs.cc @@ -97,16 +97,16 @@ static ht_view *htelfsectionheaders_init(Bounds *b, File *file, ht_format_group ht_uformat_viewer *v = NULL; bool elf_bigendian = elf_shared->ident.e_ident[ELF_EI_DATA]==ELFDATA2MSB; - if (elf_shared->ident.e_ident[ELF_EI_CLASS]==ELFCLASS32) { - v=new ht_uformat_viewer(); + if (elf_shared->ident.e_ident[ELF_EI_CLASS] == ELFCLASS32) { + v = new ht_uformat_viewer(); v->init(b, DESC_ELF_SECTION_HEADERS, VC_EDIT, file, group); registerAtom(ATOM_ELF_SH_TYPE, elf_sh_type); registerAtom(ATOM_ELF_SH_FLAGS, elf_sh_flags); - FileOfs h=elf_shared->header32.e_shoff; + FileOfs h = elf_shared->header32.e_shoff; - ht_mask_sub *m=new ht_mask_sub(); + ht_mask_sub *m = new ht_mask_sub(); m->init(file, 0); char info[128]; @@ -117,13 +117,17 @@ static ht_view *htelfsectionheaders_init(Bounds *b, File *file, ht_format_group v->insertsub(m); elf_shared->shnames = ht_malloc(elf_shared->sheaders.count * sizeof *elf_shared->shnames); - FileOfs so=elf_shared->sheaders.sheaders32[elf_shared->header32.e_shstrndx].sh_offset; + FileOfs so = elf_shared->sheaders.sheaders32[elf_shared->header32.e_shstrndx].sh_offset; String s; for (uint i=0; i < elf_shared->sheaders.count; i++) { s = "?"; - file->seek(so+elf_shared->sheaders.sheaders32[i].sh_name); - file->readStringz(s); + try { + file->seek(so + elf_shared->sheaders.sheaders32[i].sh_name); + file->readStringz(s); + } catch (const Exception &x) { + // and now? + } char t[1024]; ht_snprintf(t, sizeof t, "section %d: %y", i, &s); @@ -161,7 +165,7 @@ static ht_view *htelfsectionheaders_init(Bounds *b, File *file, ht_format_group elf_shared->shnames = ht_malloc(elf_shared->sheaders.count * sizeof *elf_shared->shnames); - FileOfs so=elf_shared->sheaders.sheaders64[elf_shared->header64.e_shstrndx].sh_offset; + FileOfs so = elf_shared->sheaders.sheaders64[elf_shared->header64.e_shstrndx].sh_offset; for (uint i=0; i < elf_shared->sheaders.count; i++) { char *s; try { From 4cc0239e440a203059b116f93a2e84c6d4a3858d Mon Sep 17 00:00:00 2001 From: seppel Date: Wed, 17 Jun 2009 18:43:37 +0000 Subject: [PATCH 09/53] . --- ChangeLog | 5 ++ asm/x86asm.cc | 42 ++++++----- asm/x86asm.h | 2 +- asm/x86dis.cc | 57 ++++++++++----- asm/x86opc.cc | 198 +++++++++++++++++++++++++++++++++++++++++++++++--- asm/x86opc.h | 10 ++- cp-demangle.c | 103 ++++++++++++++++++++++---- demangle.h | 7 +- hthex.cc | 6 +- 9 files changed, 359 insertions(+), 71 deletions(-) diff --git a/ChangeLog b/ChangeLog index 92bcd0a..f579fda 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,11 @@ HT ChangeLog ============== +version 2.0.18: + - updated c++ demangler + - [x86] SSE5/XOP/AVX merge + - symbols "first" and "last" in hex view + version 2.0.17: - compilation fixes for gcc 4.4 - fixed crash on garbage in elf section headers diff --git a/asm/x86asm.cc b/asm/x86asm.cc index 403924b..afa82fe 100644 --- a/asm/x86asm.cc +++ b/asm/x86asm.cc @@ -399,20 +399,20 @@ asm_code *x86asm::encode(asm_insn *asm_insn, int options, CPU_ADDR cur_address) set_error_msg(X86ASM_ERRMSG_INVALID_PREFIX); } else { match_fopcodes(insn); - match_opcodes(x86_insns_ext, insn, X86ASM_PREFIX_0F, MATCHOPNAME_MATCH_IF_NOOPPREFIX); - match_opcodes(x86_insns_ext_66, insn, X86ASM_PREFIX_0F, MATCHOPNAME_MATCH_IF_OPPREFIX); - match_opcodes(x86_insns_ext_f2, insn, X86ASM_PREFIX_F20F, MATCHOPNAME_MATCH_IF_NOOPPREFIX); - match_opcodes(x86_insns_ext_f3, insn, X86ASM_PREFIX_F30F, MATCHOPNAME_MATCH_IF_NOOPPREFIX); - match_opcodes(x86_opc_group_insns[0], insn, X86ASM_PREFIX_0F38, MATCHOPNAME_MATCH_IF_NOOPPREFIX); - match_opcodes(x86_opc_group_insns[1], insn, X86ASM_PREFIX_660F38, MATCHOPNAME_MATCH_IF_OPPREFIX); - match_opcodes(x86_opc_group_insns[2], insn, X86ASM_PREFIX_F20F38, MATCHOPNAME_MATCH_IF_NOOPPREFIX); - match_opcodes(x86_opc_group_insns[3], insn, X86ASM_PREFIX_0F3A, MATCHOPNAME_MATCH_IF_NOOPPREFIX); - match_opcodes(x86_opc_group_insns[4], insn, X86ASM_PREFIX_660F3A, MATCHOPNAME_MATCH_IF_OPPREFIX); - match_opcodes(x86_opc_group_insns[5], insn, X86ASM_PREFIX_0F7A, MATCHOPNAME_MATCH_IF_NOOPPREFIX); - match_opcodes(x86_opc_group_insns[6], insn, X86ASM_PREFIX_0F7B, MATCHOPNAME_MATCH_IF_NOOPPREFIX); - match_opcodes(x86_opc_group_insns[7], insn, X86ASM_PREFIX_0F24, MATCHOPNAME_MATCH_IF_NOOPPREFIX); - match_opcodes(x86_opc_group_insns[8], insn, X86ASM_PREFIX_0F25, MATCHOPNAME_MATCH_IF_NOOPPREFIX); - match_vex_opcodes(insn); + match_opcodes(x86_insns_ext, insn, X86ASM_PREFIX_0F, MATCHOPNAME_MATCH_IF_NOOPPREFIX); + match_opcodes(x86_insns_ext_66, insn, X86ASM_PREFIX_0F, MATCHOPNAME_MATCH_IF_OPPREFIX); + match_opcodes(x86_insns_ext_f2, insn, X86ASM_PREFIX_F20F, MATCHOPNAME_MATCH_IF_NOOPPREFIX); + match_opcodes(x86_insns_ext_f3, insn, X86ASM_PREFIX_F30F, MATCHOPNAME_MATCH_IF_NOOPPREFIX); + match_opcodes(x86_opc_group_insns[0], insn, X86ASM_PREFIX_0F38, MATCHOPNAME_MATCH_IF_NOOPPREFIX); + match_opcodes(x86_opc_group_insns[1], insn, X86ASM_PREFIX_660F38, MATCHOPNAME_MATCH_IF_OPPREFIX); + match_opcodes(x86_opc_group_insns[2], insn, X86ASM_PREFIX_F20F38, MATCHOPNAME_MATCH_IF_NOOPPREFIX); + match_opcodes(x86_opc_group_insns[3], insn, X86ASM_PREFIX_0F3A, MATCHOPNAME_MATCH_IF_NOOPPREFIX); + match_opcodes(x86_opc_group_insns[4], insn, X86ASM_PREFIX_660F3A, MATCHOPNAME_MATCH_IF_OPPREFIX); + match_opcodes(x86_opc_group_insns[5], insn, X86ASM_PREFIX_0F7A, MATCHOPNAME_MATCH_IF_NOOPPREFIX); + match_opcodes(x86_opc_group_insns[6], insn, X86ASM_PREFIX_0F7B, MATCHOPNAME_MATCH_IF_NOOPPREFIX); + match_opcodes(x86_opc_group_insns[7], insn, X86ASM_PREFIX_0F24, MATCHOPNAME_MATCH_IF_NOOPPREFIX); + match_opcodes(x86_opc_group_insns[8], insn, X86ASM_PREFIX_0F25, MATCHOPNAME_MATCH_IF_NOOPPREFIX); + match_vex_opcodes(insn); } if (error) { free_asm_codes(); @@ -704,7 +704,7 @@ bool x86asm::encode_vex_insn(x86asm_insn *insn, x86opc_vex_insn *opcode, int opc } } - if ((opcode->vex & 0x30) == 0x10 // 0x0f-opcode + if ((opcode->vex & 0x3c) == 0x4 // 0x0f-opcode && !(rexprefix & 3) // no rexb/rexx && !(opcode->vex & W1)) { // use short vex prefix @@ -715,9 +715,13 @@ bool x86asm::encode_vex_insn(x86asm_insn *insn, x86opc_vex_insn *opcode, int opc | (opcode->vex & 0x3); emitbyte(vex); } else { - // use long vex prefix - emitbyte(0xc4); - byte vex = (~rexprefix & 7) << 5 | ((opcode->vex & 0x30) >> 4); + // use long vex/xop prefix + if (opcode->vex & (_0f24|_0f25)) { + emitbyte(0x8f); + } else { + emitbyte(0xc4); + } + byte vex = (~rexprefix & 7) << 5 | ((opcode->vex & 0x3c) >> 2); emitbyte(vex); vex = (opcode->vex & W1) | ((~vexvvvv & 0xf) << 3) | (opcode->vex & _256) >> 4 @@ -2103,7 +2107,7 @@ bool x86asm::translate_str(asm_insn *asm_insn, const char *s) /**/ splitstr(s, insn->n, sizeof insn->n, (char**)&opp, 256); - insn->name=insn->n; + insn->name = insn->n; for (int i=0; i<5; i++) { if (!*op[i]) break; diff --git a/asm/x86asm.h b/asm/x86asm.h index 08874fb..256a0f3 100644 --- a/asm/x86asm.h +++ b/asm/x86asm.h @@ -31,7 +31,7 @@ struct x86asm_insn { char repprefix; char segprefix; char opsizeprefix; - char n[16]; + char n[32]; char *name; x86_insn_op op[5]; }; diff --git a/asm/x86dis.cc b/asm/x86dis.cc index dac39dd..8266b07 100644 --- a/asm/x86dis.cc +++ b/asm/x86dis.cc @@ -48,6 +48,7 @@ #define vexl(vex) (!!((vex)&0x04)) #define vexmmmm(vex) ((vex)&0xf) +#define vexmmmmm(vex) ((vex)&0x1f) #define vexvvvv(vex) (((~(vex))>>3)&0xf) #define vexpp(vex) ((vex)&0x3) @@ -286,7 +287,7 @@ void x86dis::decode_vex_insn(x86opc_vex_insn *xinsn) { if (xinsn) { byte vex = (insn.vexprefix.w << 7) | (insn.vexprefix.l << 6) - | (insn.vexprefix.mmmm << 4) | insn.vexprefix.pp; + | (insn.vexprefix.mmmm << 2) | insn.vexprefix.pp; while (!xinsn->name && xinsn->op[0] == SPECIAL_TYPE_GROUP) { if (xinsn->vex == vex) { getdisp(); @@ -380,8 +381,24 @@ void x86dis::decode_insn(x86opc_insn *xinsn) } invalidate(); break; + case 0x8f: case 0xc4: case 0xc5: { + byte vex = getbyte(); + if (c == 0x8f) { + if ((vex & 0x08) == 0) { + modrm = vex; + decode_insn(&x86_pop_group); + break; + } + } else { + if (addrsize != X86_ADDRSIZE64 + && (vex & 0xc0) != 0xc0) { + modrm = vex; + decode_insn(c == 0xc4 ? &x86_les : &x86_lds); + break; + } + } if (insn.opsizeprefix != X86_PREFIX_NO || insn.lockprefix != X86_PREFIX_NO || insn.repprefix != X86_PREFIX_NO @@ -389,30 +406,32 @@ void x86dis::decode_insn(x86opc_insn *xinsn) invalidate(); break; } - byte vex = getbyte(); - if (addrsize != X86_ADDRSIZE64 - && (vex & 0xc0) != 0xc0) { - modrm = vex; - decode_insn(c == 0xc4 ? &x86_les : &x86_lds); - break; - } insn.rexprefix = 0x40; - insn.rexprefix = vexr(vex) << 2; - if (c == 0xc4) { - // 3 byte vex + insn.rexprefix |= vexr(vex) << 2; + if (c == 0xc5) { + // 2 byte vex + insn.vexprefix.mmmm = 1; + } else { + // 3 byte vex / xop insn.rexprefix |= vexx(vex) << 1; insn.rexprefix |= vexb(vex); - insn.vexprefix.mmmm = vexmmmm(vex); - if (insn.vexprefix.mmmm == 0 - || insn.vexprefix.mmmm > 3) { - invalidate(); - break; + if (c == 0x8f) { + insn.vexprefix.mmmm |= vexmmmmm(vex); + if (insn.vexprefix.mmmm != 8 + && insn.vexprefix.mmmm != 9) { + invalidate(); + break; + } + } else { + insn.vexprefix.mmmm |= vexmmmm(vex); + if (insn.vexprefix.mmmm == 0 + || insn.vexprefix.mmmm > 3) { + invalidate(); + break; + } } vex = getbyte(); insn.vexprefix.w |= vexw(vex); - } else { - // 2 byte vex - insn.vexprefix.mmmm = 1; } insn.vexprefix.vvvv = vexvvvv(vex); insn.vexprefix.l = vexl(vex); diff --git a/asm/x86opc.cc b/asm/x86opc.cc index f5018d1..6ab584c 100644 --- a/asm/x86opc.cc +++ b/asm/x86opc.cc @@ -194,8 +194,10 @@ x86opc_insn_op x86_op_type[] = { {TYPE_YR, 0, 0, SIZE_Y}, #define Xy YRy+1 {TYPE_X, 0, 0, SIZE_Y}, +#define Xo Xy+1 +{TYPE_X, 0, 0, SIZE_O}, -#define VD Xy+1 +#define VD Xo+1 {TYPE_VD, 0, 0, SIZE_O}, #define VS0d VD+1 {TYPE_VS, 0, 0, SIZE_D}, @@ -439,6 +441,7 @@ const char *x86_segs[8] = { x86opc_insn x86_les = {"les", {Gv, Mp}}; x86opc_insn x86_lds = {"lds", {Gv, Mp}}; +x86opc_insn x86_pop_group = {0, {SPECIAL_TYPE_GROUP, GROUP_8F}}; x86opc_insn x86_32_insns[256] = { /* 00 */ @@ -602,7 +605,7 @@ x86opc_insn x86_32_insns[256] = { {"mov", {Ev, Sw}}, {"lea", {Gv, M}}, {"mov", {Sw, Ev}}, -{0, {SPECIAL_TYPE_GROUP, GROUP_8F}}, +{0, {SPECIAL_TYPE_PREFIX}}, // XOP prefix {0, {SPECIAL_TYPE_GROUP, GROUP_8F}}, /* 90 */ {"nop"}, /* same as xchg (e)ax, (e)ax */ {"xchg", {X__ax, __cx}}, @@ -3659,6 +3662,10 @@ E(5c) {"vsubpd", _256|_66|_0f, {Yy, YVy, Xy}}, {"vsubss", _128|_f2|_0f, {Vo, VVo, Wo}}, {"vsubsd", _128|_f3|_0f, {Vo, VVo, Wo}}, +{"vfmaddsubps", _128|_66|_0f3a|W0, {Vo, VIo, Wo, VVo}}, +{"vfmaddsubps", _128|_66|_0f3a|W1, {Vo, VIo, VVo, Wo}}, +{"vfmaddsubps", _256|_66|_0f3a|W0, {Yy, YIy, Xy, YVy}}, +{"vfmaddsubps", _256|_66|_0f3a|W1, {Yy, YIy, YVy, Xy}}, E(5d) {"vminps", _128|_0f, {Vo, VVo, Wo}}, {"vminps", _256|_0f, {Yy, YVy, Xy}}, @@ -3666,6 +3673,10 @@ E(5d) {"vminpd", _256|_66|_0f, {Yy, YVy, Xy}}, {"vminss", _128|_f2|_0f, {Vo, VVo, Wo}}, {"vminsd", _128|_f3|_0f, {Vo, VVo, Wo}}, +{"vfmaddsubpd", _128|_66|_0f3a|W0, {Vo, VIo, Wo, VVo}}, +{"vfmaddsubpd", _128|_66|_0f3a|W1, {Vo, VIo, VVo, Wo}}, +{"vfmaddsubpd", _256|_66|_0f3a|W0, {Yy, YIy, Xy, YVy}}, +{"vfmaddsubpd", _256|_66|_0f3a|W1, {Yy, YIy, YVy, Xy}}, E(5e) {"vdivps", _128|_0f, {Vo, VVo, Wo}}, {"vdivps", _256|_0f, {Yy, YVy, Xy}}, @@ -3673,6 +3684,10 @@ E(5e) {"vdivpd", _256|_66|_0f, {Yy, YVy, Xy}}, {"vdivss", _128|_f2|_0f, {Vo, VVo, Wo}}, {"vdivsd", _128|_f3|_0f, {Vo, VVo, Wo}}, +{"vfmsubaddps", _128|_66|_0f3a|W0, {Vo, VIo, Wo, VVo}}, +{"vfmsubaddps", _128|_66|_0f3a|W1, {Vo, VIo, VVo, Wo}}, +{"vfmsubaddps", _256|_66|_0f3a|W0, {Yy, YIy, Xy, YVy}}, +{"vfmsubaddps", _256|_66|_0f3a|W1, {Yy, YIy, YVy, Xy}}, E(5f) {"vmaxps", _128|_0f, {Vo, VVo, Wo}}, {"vmaxps", _256|_0f, {Yy, YVy, Xy}}, @@ -3680,6 +3695,10 @@ E(5f) {"vmaxpd", _256|_66|_0f, {Yy, YVy, Xy}}, {"vmaxss", _128|_f2|_0f, {Vo, VVo, Wo}}, {"vmaxsd", _128|_f3|_0f, {Vo, VVo, Wo}}, +{"vfmsubaddpd", _128|_66|_0f3a|W0, {Vo, VIo, Wo, VVo}}, +{"vfmsubaddpd", _128|_66|_0f3a|W1, {Vo, VIo, VVo, Wo}}, +{"vfmsubaddpd", _256|_66|_0f3a|W0, {Yy, YIy, Xy, YVy}}, +{"vfmsubaddpd", _256|_66|_0f3a|W1, {Yy, YIy, YVy, Xy}}, E(60) {"vpcmpestrm", _128|_66|_0f3a, {Vo, Wo, Ib}}, {"vpunpcklbw", _128|_66|_0f, {Vo, VVo, Wo}}, @@ -3702,24 +3721,48 @@ E(67) {"vpackuswb", _128|_66|_0f, {Vo, VVo, Wo}}, E(68) {"vpunpckhbw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vfmaddps", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, +{"vfmaddps", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, +{"vfmaddps", _256|_66|_0f3a|W0, {Yy, YIy, YVy, Xy}}, +{"vfmaddps", _256|_66|_0f3a|W1, {Yy, YIy, Xy, YVy}}, E(69) {"vpunpckhwd", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vfmaddpd", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, +{"vfmaddpd", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, +{"vfmaddpd", _256|_66|_0f3a|W0, {Yy, YIy, YVy, Xy}}, +{"vfmaddpd", _256|_66|_0f3a|W1, {Yy, YIy, Xy, YVy}}, E(6a) {"vpunpckhdq", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vfmaddss", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, +{"vfmaddss", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, E(6b) {"vpackssdw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vfmaddsd", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, +{"vfmaddsd", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, E(6c) {"vpunpcklqdq", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vfmsubps", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, +{"vfmsubps", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, +{"vfmsubps", _256|_66|_0f3a|W0, {Yy, YIy, YVy, Xy}}, +{"vfmsubps", _256|_66|_0f3a|W1, {Yy, YIy, Xy, YVy}}, E(6d) {"vpunpckhqdq", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vfmsubpd", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, +{"vfmsubpd", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, +{"vfmsubpd", _256|_66|_0f3a|W0, {Yy, YIy, YVy, Xy}}, +{"vfmsubpd", _256|_66|_0f3a|W1, {Yy, YIy, Xy, YVy}}, E(6e) {"vmovd", _128|_66|_0f|W0, {Vo, Ed}}, {"vmovq", _128|_66|_0f|W1, {Vo, Eq}}, +{"vfmsubss", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, +{"vfmsubss", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, E(6f) {"vmovdqa", _128|_66|_0f, {Vo, Wo}}, {"vmovdqa", _256|_66|_0f, {Yy, Xy}}, {"vmovdqu", _128|_f3|_0f, {Vo, Wo}}, {"vmovdqu", _256|_f3|_0f, {Yy, Xy}}, +{"vfmsubsd", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, +{"vfmsubsd", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, E(70) {"vpshufd", _128|_66|_0f, {Vo, Wo, Ib}}, {"vpshufhw", _128|_f3|_0f, {Vo, Wo, Ib}}, @@ -3739,49 +3782,132 @@ E(76) E(77) {"vzeroupper", _128|_0f}, {"vzeroall", _256|_0f}, +E(78) +{"vfnmaddps", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, +{"vfnmaddps", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, +{"vfnmaddps", _256|_66|_0f3a|W0, {Yy, YIy, YVy, Xy}}, +{"vfnmaddps", _256|_66|_0f3a|W1, {Yy, YIy, Xy, YVy}}, +E(79) +{"vfnmaddpd", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, +{"vfnmaddpd", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, +{"vfnmaddpd", _256|_66|_0f3a|W0, {Yy, YIy, YVy, Xy}}, +{"vfnmaddpd", _256|_66|_0f3a|W1, {Yy, YIy, Xy, YVy}}, +E(7a) +{"vfnmaddss", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, +{"vfnmaddss", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, +E(7b) +{"vfnmaddsd", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, +{"vfnmaddsd", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, E(7c) {"vhaddpd", _128|_66|_0f, {Vo, VVo, Wo}}, {"vhaddpd", _256|_66|_0f, {Yy, YVy, Xy}}, {"vhaddss", _128|_f2|_0f, {Vo, VVo, Wo}}, {"vhaddss", _256|_f2|_0f, {Yy, YVy, Xy}}, +{"vfnmsubps", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, +{"vfnmsubps", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, +{"vfnmsubps", _256|_66|_0f3a|W0, {Yy, YIy, YVy, Xy}}, +{"vfnmsubps", _256|_66|_0f3a|W1, {Yy, YIy, Xy, YVy}}, E(7d) {"vhsubpd", _128|_66|_0f, {Vo, VVo, Wo}}, {"vhsubpd", _256|_66|_0f, {Yy, YVy, Xy}}, {"vhsubss", _128|_f2|_0f, {Vo, VVo, Wo}}, {"vhsubss", _256|_f2|_0f, {Yy, YVy, Xy}}, +{"vfnmsubpd", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, +{"vfnmsubpd", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, +{"vfnmsubpd", _256|_66|_0f3a|W0, {Yy, YIy, YVy, Xy}}, +{"vfnmsubpd", _256|_66|_0f3a|W1, {Yy, YIy, Xy, YVy}}, E(7e) {"vmovd", _128|_66|_0f|W0, {Ed, Vo}}, {"vmovq", _128|_66|_0f|W1, {Eq, Vo}}, {"vmovq", _128|_f3|_0f, {Vo, Wq}}, +{"vfnmsubss", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, +{"vfnmsubss", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, E(7f) {"vmovdqa", _128|_66|_0f, {Wo, Vo}}, {"vmovdqa", _256|_66|_0f, {Xy, Yy}}, {"vmovdqu", _128|_f3|_0f, {Wo, Vo}}, {"vmovdqu", _256|_f3|_0f, {Xy, Yy}}, +{"vfnmsubsd", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, +{"vfnmsubsd", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, +E(80) +{"vfrczpd", _128|_0f25, {Vo, Wo}}, +{"vfrczpd", _256|_0f25, {Yy, Xy}}, +E(81) +{"vfrczps", _128|_0f25, {Vo, Wo}}, +{"vfrczps", _256|_0f25, {Yy, Xy}}, +E(82) +{"vfrczsd", _128|_0f25, {Vo, Wo}}, +{"vfrczsd", _256|_0f25, {Yy, Xy}}, +E(83) +{"vfrczss", _128|_0f25, {Vo, Wo}}, +{"vfrczss", _256|_0f25, {Yy, Xy}}, +E(85) +{"vpmacssww", _128|_0f24, {Vo, VVo, Wo, VIo}}, +E(86) +{"vpmacsswd", _128|_0f24, {Vo, VVo, Wo, VIo}}, +E(87) +{"vpmacssdql", _128|_0f24, {Vo, VVo, Wo, VIo}}, +E(8e) +{"vpmacssdd", _128|_0f24, {Vo, VVo, Wo, VIo}}, +E(8f) +{"vpmacssdqh", _128|_0f24, {Vo, VVo, Wo, VIo}}, +E(90) +{"vprotb", _128|_0f25|W0, {Vo, Wo, VVo}}, +{"vprotb", _128|_0f25|W1, {Vo, VVo, Wo}}, +E(91) +{"vprotw", _128|_0f25|W0, {Vo, Wo, VVo}}, +{"vprotw", _128|_0f25|W1, {Vo, VVo, Wo}}, +E(92) +{"vprotd", _128|_0f25|W0, {Vo, Wo, VVo}}, +{"vprotd", _128|_0f25|W1, {Vo, VVo, Wo}}, +E(93) +{"vprotq", _128|_0f25|W0, {Vo, Wo, VVo}}, +{"vprotq", _128|_0f25|W1, {Vo, VVo, Wo}}, +E(94) +{"vpshlb", _128|_0f25|W0, {Vo, Wo, VVo}}, +{"vpshlb", _128|_0f25|W1, {Vo, VVo, Wo}}, +E(95) +{"vpmacsww", _128|_0f24, {Vo, VVo, Wo, VIo}}, +{"vpshlw", _128|_0f25|W0, {Vo, Wo, VVo}}, +{"vpshlw", _128|_0f25|W1, {Vo, VVo, Wo}}, E(96) {"vfmaddsub132ps", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, {"vfmaddsub132ps", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, {"vfmaddsub132pd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, {"vfmaddsub132pd", _256|_66|_0f38|W1, {Yy, YVy, Xy}}, +{"vpmacswd", _128|_0f24, {Vo, VVo, Wo, VIo}}, +{"vpshld", _128|_0f25|W0, {Vo, Wo, VVo}}, +{"vpshld", _128|_0f25|W1, {Vo, VVo, Wo}}, E(97) {"vfmaddsub132ss", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, {"vfmaddsub132sd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +{"vpmacsdql", _128|_0f24, {Vo, VVo, Wo, VIo}}, +{"vpshlq", _128|_0f25|W0, {Vo, Wo, VVo}}, +{"vpshlq", _128|_0f25|W1, {Vo, VVo, Wo}}, E(98) {"vfmadd132ps", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, {"vfmadd132ps", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, {"vfmadd132pd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, {"vfmadd132pd", _256|_66|_0f38|W1, {Yy, YVy, Xy}}, +{"vpshab", _128|_0f25|W0, {Vo, Wo, VVo}}, +{"vpshab", _128|_0f25|W1, {Vo, VVo, Wo}}, E(99) {"vfmadd132ss", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, {"vfmadd132sd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +{"vpshaw", _128|_0f25|W0, {Vo, Wo, VVo}}, +{"vpshaw", _128|_0f25|W1, {Vo, VVo, Wo}}, E(9a) {"vfmsub132ps", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, {"vfmsub132ps", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, {"vfmsub132pd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, {"vfmsub132pd", _256|_66|_0f38|W1, {Yy, YVy, Xy}}, +{"vpshad", _128|_0f25|W0, {Vo, Wo, VVo}}, +{"vpshad", _128|_0f25|W1, {Vo, VVo, Wo}}, E(9b) {"vfmsub132ss", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, {"vfmsub132sd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +{"vpshaq", _128|_0f25|W0, {Vo, Wo, VVo}}, +{"vpshaq", _128|_0f25|W1, {Vo, VVo, Wo}}, E(9c) {"vfnmadd132ps", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, {"vfnmadd132ps", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, @@ -3795,14 +3921,31 @@ E(9e) {"vfnmsub132ps", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, {"vfnmsub132pd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, {"vfnmsub132pd", _256|_66|_0f38|W1, {Yy, YVy, Xy}}, +{"vpmacsdd", _128|_0f24, {Vo, VVo, Wo, VIo}}, E(9f) {"vfnmsub132ss", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, {"vfnmsub132sd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +{"vpmacsdqh", _128|_0f24, {Vo, VVo, Wo, VIo}}, +E(a0) +{"vcvtph2ps", _128|_0f24, {Vo, Wq, Ib}}, +{"vcvtph2ps", _256|_0f24, {Yy, Xo, Ib}}, +E(a1) +{"vcvtps2ph", _128|_0f25, {Wq, Vo}}, +{"vcvtps2ph", _256|_0f25, {Xo, Yy}}, +E(a2) +{"vpcmov", _128|_0f24|W0, {Vo, VVo, Wo, VIo}}, +{"vpcmov", _256|_0f24|W0, {Yy, YVy, Xy, YIy}}, +{"vpcmov", _128|_0f24|W1, {Vo, VVo, VIo, Wo}}, +{"vpcmov", _256|_0f24|W1, {Yy, YVy, YIy, Xy}}, +E(a3) +{"vpperm", _128|_0f24|W0, {Vo, VVo, Wo, VIo}}, +{"vpperm", _128|_0f24|W1, {Vo, VVo, VIo, Wo}}, E(a6) {"vfmaddsub213ps", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, {"vfmaddsub213ps", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, {"vfmaddsub213pd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, {"vfmaddsub213pd", _256|_66|_0f38|W1, {Yy, YVy, Xy}}, +{"vpmadcsswd", _128|_0f24, {Vo, VVo, Wo, VIo}}, E(a7) {"vfmaddsub213ss", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, {"vfmaddsub213sd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, @@ -3844,6 +3987,7 @@ E(b6) {"vfmaddsub231ps", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, {"vfmaddsub231pd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, {"vfmaddsub231pd", _256|_66|_0f38|W1, {Yy, YVy, Xy}}, +{"vpmadcswd", _128|_0f24, {Vo, VVo, Wo, VIo}}, E(b7) {"vfmaddsub231ss", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, {"vfmaddsub231sd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, @@ -3879,6 +4023,11 @@ E(be) E(bf) {"vfnmsub231ss", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, {"vfnmsub231sd", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +E(c0) +{"vprotb", _128|_0f24, {Vo, Wo, Ib}}, +E(c1) +{"vprotw", _128|_0f24, {Vo, Wo, Ib}}, +{"vphaddbw", _128|_0f25, {Vo, Wo}}, E(c2) {"vcmpps", _128|_0f, {Vo, VVo, Wo, Ib}}, {"vcmpps", _256|_0f, {Yy, YVy, Xy, Ib}}, @@ -3886,6 +4035,11 @@ E(c2) {"vcmppd", _256|_66|_0f, {Yy, YVy, Xy, Ib}}, {"vcmpss", _128|_f2|_0f, {Vo, VVo, Wo, Ib}}, {"vcmpsd", _128|_f3|_0f, {Vo, VVo, Wo, Ib}}, +{"vprotd", _128|_0f24, {Vo, Wo, Ib}}, +{"vphaddbd", _128|_0f25, {Vo, Wo}}, +E(c3) +{"vprotq", _128|_0f24, {Vo, Wo, Ib}}, +{"vphaddbd", _128|_0f25, {Vo, Wo}}, E(c4) {"pinsrw", _128|_66|_0f, {Vo, MRwr, Ib}}, E(c5) @@ -3895,6 +4049,16 @@ E(c6) {"vshufps", _256|_0f, {Yy, YVy, Xy, Ib}}, {"vshufpd", _128|_66|_0f, {Vo, VVo, Wo, Ib}}, {"vshufpd", _256|_66|_0f, {Yy, YVy, Xy, Ib}}, +E(cb) +{"vphadddq", _128|_0f25, {Vo, Wo}}, +E(cc) +{"vpcomb", _128|_0f24, {Vo, VVo, Wo, Ib}}, +E(cd) +{"vpcomw", _128|_0f24, {Vo, VVo, Wo, Ib}}, +E(ce) +{"vpcomd", _128|_0f24, {Vo, VVo, Wo, Ib}}, +E(cf) +{"vpcomq", _128|_0f24, {Vo, VVo, Wo, Ib}}, E(d0) {"vaddsubpd", _128|_66|_0f, {Vo, VVo, Wo}}, {"vaddsubpd", _256|_66|_0f, {Yy, YVy, Xy}}, @@ -3902,20 +4066,27 @@ E(d0) {"vaddsubss", _256|_f2|_0f, {Yy, YVy, Xy}}, E(d1) {"vpsrlw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vphaddubw", _128|_0f25, {Vo, Wo}}, E(d2) {"vpsrld", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vphaddubd", _128|_0f25, {Vo, Wo}}, E(d3) {"vpsrlq", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vphaddubq", _128|_0f25, {Vo, Wo}}, E(d4) {"vpaddq", _128|_66|_0f, {Vo, VVo, Wo}}, E(d5) {"vpmullw", _128|_66|_0f, {Vo, VVo, Wo}}, E(d6) {"vmovq", _128|_66|_0f, {Wq, Vo}}, +{"vphadduwd", _128|_0f25, {Vo, Wo}}, E(d7) {"vpmovmskb", _128|_66|_0f, {Gd, VRo}}, +{"vphadduwq", _128|_0f25, {Vo, Wo}}, +{"vphaddwq", _128|_0f25, {Vo, Wo}}, // FIXME E(d8) {"vpsubusb", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vphaddudq", _128|_0f25, {Vo, Wo}}, E(d9) {"vpsubusw", _128|_66|_0f, {Vo, VVo, Wo}}, E(da) @@ -3940,10 +4111,13 @@ E(e0) {"vpavgb", _128|_66|_0f, {Vo, VVo, Wo}}, E(e1) {"vpsraw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vphsubbw", _128|_0f25, {Vo, Wo}}, E(e2) {"vpsrad", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vphsubwd", _128|_0f25, {Vo, Wo}}, E(e3) {"vpavgw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vphsubdq", _128|_0f25, {Vo, Wo}}, E(e4) {"vpmulhuw", _128|_66|_0f, {Vo, VVo, Wo}}, E(e5) @@ -3968,12 +4142,16 @@ E(eb) {"vpor", _128|_66|_0f, {Vo, VVo, Wo}}, E(ec) {"vpaddsb", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpcomub", _128|_0f24, {Vo, VVo, Wo, Ib}}, E(ed) {"vpaddsw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpcomuw", _128|_0f24, {Vo, VVo, Wo, Ib}}, E(ee) {"vpmaxsw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpcomud", _128|_0f24, {Vo, VVo, Wo, Ib}}, E(ef) {"vpxor", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpcomuq", _128|_0f24, {Vo, VVo, Wo, Ib}}, E(f0) {"vlddqu", _128|_f2|_0f, {Vo, Mo}}, {"vlddqu", _256|_f2|_0f, {Yy, My}}, @@ -4070,17 +4248,17 @@ v58, v59, v5a, v5b, v5c, v5d, v5e, v5f, v60, v61, v62, v63, v64, v65, v66, v67, v68, v69, v6a, v6b, v6c, v6d, v6e, v6f, v70, v71, v72, v73, v74, v75, v76, v77, - 0, 0, 0, 0, v7c, v7d, v7e, v7f, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, v96, v97, +v78, v79, v7a, v7b, v7c, v7d, v7e, v7f, +v80, v81, v82, v83, 0, v85, v86, v87, + 0, 0, 0, 0, 0, 0, v8e, v8f, +v90, v91, v92, v93, v94, v95, v96, v97, v98, v99, v9a, v9b, v9c, v9d, v9e, v9f, - 0, 0, 0, 0, 0, 0, va6, va7, +va0, va1, va2, 0, 0, 0, va6, va7, va8, va9, vaa, vab, vac, vad, vae, vaf, - 0, 0, 0, 0, 0, 0, vb6, vb7, + 0, 0, 0, va3, 0, 0, vb6, vb7, vb8, vb9, vba, vbb, vbc, vbd, vbe, vbf, - 0, 0, vc2, 0, vc4, vc5, vc6, 0, - 0, 0, 0, 0, 0, 0, 0, 0, +vc0, vc1, vc2, vc3, vc4, vc5, vc6, 0, + 0, 0, 0, vcb, vcc, vcd, vce, vcf, vd0, vd1, vd2, vd3, vd4, vd5, vd6, vd7, vd8, vd9, vda, vdb, vdc, vdd, vde, vdf, ve0, ve1, ve2, ve3, ve4, ve5, ve6, ve7, diff --git a/asm/x86opc.h b/asm/x86opc.h index fa9b90d..581903c 100644 --- a/asm/x86opc.h +++ b/asm/x86opc.h @@ -165,9 +165,12 @@ enum X86_VEX { _f3 = 0x02, _f2 = 0x03, - _0f = 0x10, - _0f38 = 0x20, - _0f3a = 0x30, + _0f = 0x04, + _0f38 = 0x08, + _0f3a = 0x0c, + + _0f24 = 0x20, + _0f25 = 0x24, }; /* when name is == 0, the first op has a special meaning (layout see x86_insn_op_special) */ @@ -256,6 +259,7 @@ struct x86opc_finsn { extern x86opc_insn x86_les; extern x86opc_insn x86_lds; +extern x86opc_insn x86_pop_group; extern const char *x86_regs[4][8]; extern const char *x86_64regs[4][16]; diff --git a/cp-demangle.c b/cp-demangle.c index 53e9645..0042b21 100644 --- a/cp-demangle.c +++ b/cp-demangle.c @@ -717,8 +717,8 @@ cplus_demangle_fill_ctor (struct demangle_component *p, { if (p == NULL || name == NULL - || (kind < gnu_v3_complete_object_ctor - && kind > gnu_v3_complete_object_allocating_ctor)) + || (int) kind < gnu_v3_complete_object_ctor + || (int) kind > gnu_v3_complete_object_allocating_ctor) return 0; p->type = DEMANGLE_COMPONENT_CTOR; p->u.s_ctor.kind = kind; @@ -736,8 +736,8 @@ cplus_demangle_fill_dtor (struct demangle_component *p, { if (p == NULL || name == NULL - || (kind < gnu_v3_deleting_dtor - && kind > gnu_v3_base_object_dtor)) + || (int) kind < gnu_v3_deleting_dtor + || (int) kind > gnu_v3_base_object_dtor) return 0; p->type = DEMANGLE_COMPONENT_DTOR; p->u.s_dtor.kind = kind; @@ -962,6 +962,22 @@ d_make_template_param (struct d_info *di, long i) return p; } +/* Add a new function parameter. */ + +static struct demangle_component * +d_make_function_param (struct d_info *di, long i) +{ + struct demangle_component *p; + + p = d_make_empty (di); + if (p != NULL) + { + p->type = DEMANGLE_COMPONENT_FUNCTION_PARAM; + p->u.s_number.number = i; + } + return p; +} + /* Add a new standard substitution component. */ static struct demangle_component * @@ -987,7 +1003,11 @@ CP_STATIC_IF_GLIBCPP_V3 struct demangle_component * cplus_demangle_mangled_name (struct d_info *di, int top_level) { - if (! d_check_char (di, '_')) + if (! d_check_char (di, '_') + /* Allow missing _ if not at toplevel to work around a + bug in G++ abi-version=2 mangling; see the comment in + write_template_arg. */ + && top_level) return NULL; if (! d_check_char (di, 'Z')) return NULL; @@ -1479,6 +1499,8 @@ const struct demangle_operator_info cplus_demangle_operators[] = { "rs", NL (">>"), 2 }, { "st", NL ("sizeof "), 1 }, { "sz", NL ("sizeof "), 1 }, + { "at", NL ("alignof "), 1 }, + { "az", NL ("alignof "), 1 }, { NULL, NULL, 0, 0 } }; @@ -2562,12 +2584,31 @@ d_expression (struct d_info *di) d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name, d_template_args (di))); } - else if (peek == 's' - && (d_peek_next_char (di) == 'T' || d_peek_next_char (di) == 'R')) + else if (peek == 's' && d_peek_next_char (di) == 'p') { - /* Just demangle a parameter placeholder as its type. */ d_advance (di, 2); - return cplus_demangle_type (di); + return d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION, + d_expression (di), NULL); + } + else if (peek == 'f' && d_peek_next_char (di) == 'p') + { + /* Function parameter used in a late-specified return type. */ + int index; + d_advance (di, 2); + if (d_peek_char (di) == '_') + index = 1; + else + { + index = d_number (di); + if (index < 0) + return NULL; + index += 2; + } + + if (! d_check_char (di, '_')) + return NULL; + + return d_make_function_param (di, index); } else if (IS_DIGIT (peek)) { @@ -2617,8 +2658,16 @@ d_expression (struct d_info *di) switch (args) { case 1: - return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op, - d_expression (di)); + { + struct demangle_component *operand; + if (op->type == DEMANGLE_COMPONENT_CAST + && d_check_char (di, '_')) + operand = d_exprlist (di); + else + operand = d_expression (di); + return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op, + operand); + } case 2: { struct demangle_component *left; @@ -2669,7 +2718,9 @@ d_expr_primary (struct d_info *di) if (! d_check_char (di, 'L')) return NULL; - if (d_peek_char (di) == '_') + if (d_peek_char (di) == '_' + /* Workaround for G++ bug; see comment in write_template_arg. */ + || d_peek_char (di) == 'Z') ret = cplus_demangle_mangled_name (di, 0); else { @@ -3197,6 +3248,7 @@ d_find_pack (struct d_print_info *dpi, case DEMANGLE_COMPONENT_BUILTIN_TYPE: case DEMANGLE_COMPONENT_SUB_STD: case DEMANGLE_COMPONENT_CHARACTER: + case DEMANGLE_COMPONENT_FUNCTION_PARAM: return NULL; case DEMANGLE_COMPONENT_EXTENDED_OPERATOR: @@ -3237,7 +3289,8 @@ d_print_subexpr (struct d_print_info *dpi, const struct demangle_component *dc) { int simple = 0; - if (dc->type == DEMANGLE_COMPONENT_NAME) + if (dc->type == DEMANGLE_COMPONENT_NAME + || dc->type == DEMANGLE_COMPONENT_FUNCTION_PARAM) simple = 1; if (!simple) d_append_char (dpi, '('); @@ -3291,6 +3344,7 @@ d_print_comp (struct d_print_info *dpi, the right place for the type. We also have to pass down any CV-qualifiers, which apply to the this parameter. */ hold_modifiers = dpi->modifiers; + dpi->modifiers = 0; i = 0; typed_name = d_left (dc); while (typed_name != NULL) @@ -3964,10 +4018,20 @@ d_print_comp (struct d_print_info *dpi, case DEMANGLE_COMPONENT_PACK_EXPANSION: { - struct demangle_component *a = d_find_pack (dpi, d_left (dc)); - int len = d_pack_length (a); + int len; int i; + struct demangle_component *a = d_find_pack (dpi, d_left (dc)); + if (a == NULL) + { + /* d_find_pack won't find anything if the only packs involved + in this expansion are function parameter packs; in that + case, just print the pattern and "...". */ + d_print_subexpr (dpi, d_left (dc)); + d_append_string (dpi, "..."); + return; + } + len = d_pack_length (a); dc = d_left (dc); for (i = 0; i < len; ++i) { @@ -3979,6 +4043,15 @@ d_print_comp (struct d_print_info *dpi, } return; + case DEMANGLE_COMPONENT_FUNCTION_PARAM: + { + char buf[25]; + d_append_string (dpi, "parm#"); + sprintf(buf,"%ld", dc->u.s_number.number); + d_append_string (dpi, buf); + return; + } + default: d_print_error (dpi); return; diff --git a/demangle.h b/demangle.h index dea47d5..2b031ec 100644 --- a/demangle.h +++ b/demangle.h @@ -34,7 +34,6 @@ extern "C" { #endif /* __cplusplus */ - /* These macros provide a K&R/C89/C++-friendly way of allocating structures with nice encapsulation. The XDELETE*() macros are technically superfluous, but provided here for symmetry. Using them consistently @@ -247,6 +246,8 @@ enum demangle_component_type /* A template parameter. This holds a number, which is the template parameter index. */ DEMANGLE_COMPONENT_TEMPLATE_PARAM, + /* A function parameter. This holds a number, which is the index. */ + DEMANGLE_COMPONENT_FUNCTION_PARAM, /* A constructor. This holds a name and the kind of constructor. */ DEMANGLE_COMPONENT_CTOR, @@ -492,10 +493,10 @@ struct demangle_component int len; } s_string; - /* For DEMANGLE_COMPONENT_TEMPLATE_PARAM. */ + /* For DEMANGLE_COMPONENT_*_PARAM. */ struct { - /* Template parameter index. */ + /* Parameter index. */ long number; } s_number; diff --git a/hthex.cc b/hthex.cc index 120b2ab..1ee65cd 100644 --- a/hthex.cc +++ b/hthex.cc @@ -259,6 +259,8 @@ bool ht_hex_viewer::symbol_handler(eval_scalar *result, char *name) scalar_create_int_q(result, ofs); return true; } + if (strcmp(name, "first") == 0) {scalar_create_int_q(result, 0); return true;} + if (strcmp(name, "last") == 0) {scalar_create_int_q(result, file->getSize() - 1); return true;} if (strcmp(name, "u8") == 0) return reada(result, this, 1, little_endian, false); if (strcmp(name, "u16") == 0) return reada(result, this, 2, little_endian, false); if (strcmp(name, "u32") == 0) return reada(result, this, 4, little_endian, false); @@ -321,6 +323,8 @@ bool ht_hex_viewer::func_handler(eval_scalar *result, char *name, eval_scalarlis eval_func myfuncs[] = { {"$", 0, {SCALAR_INT}, "current offset"}, {"o", 0, {SCALAR_INT}, "current offset"}, + {"first", 0, {SCALAR_INT}, "first offset"}, + {"last", 0, {SCALAR_INT}, "last offset"}, {"u8", 0, {SCALAR_INT}, "byte at cursor"}, {"u16", 0, {SCALAR_INT}, "little endian 16 bit word at cursor"}, {"u32", 0, {SCALAR_INT}, "little endian 32 bit word at cursor"}, @@ -329,7 +333,7 @@ bool ht_hex_viewer::func_handler(eval_scalar *result, char *name, eval_scalarlis {"s16", 0, {SCALAR_INT}, "signed little endian 16 bit word at cursor"}, {"s32", 0, {SCALAR_INT}, "signed little endian 32 bit word at cursor"}, {"u16be", 0, {SCALAR_INT}, "big endian 16 bit word at cursor"}, - {"u32be", 0, {SCALAR_INT}, "big endian 32 bit word at cursor"}, + {"u32be", 0, {SCALAR_INT}, "big endian 32 bit word at cursor"}, {"u64be", 0, {SCALAR_INT}, "big endian 64 bit word at cursor"}, {"s16be", 0, {SCALAR_INT}, "signed big endian 16 bit word at cursor"}, {"s32be", 0, {SCALAR_INT}, "signed big endian 32 bit word at cursor"}, From 60c4382bc1eb59b7524ef01ccdf3a7f5cb03e09f Mon Sep 17 00:00:00 2001 From: seppel Date: Tue, 30 Jun 2009 20:07:18 +0000 Subject: [PATCH 10/53] . --- configure.in | 2 +- doc/ht.texi | 4 ++-- hteval.cc | 2 +- htinfo.h | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/configure.in b/configure.in index 5b78ebf..6b9ba92 100644 --- a/configure.in +++ b/configure.in @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. -AC_INIT(ht,[2.0.17],[https://sourceforge.net/tracker/?group_id=1066]) +AC_INIT(ht,[2.0.18],[https://sourceforge.net/tracker/?group_id=1066]) AC_PREREQ(2.59) dnl Check the system. diff --git a/doc/ht.texi b/doc/ht.texi index d040786..8143588 100644 --- a/doc/ht.texi +++ b/doc/ht.texi @@ -51,7 +51,7 @@ be registered in certain jurisdictions. @titlepage @title{HT Manual} -@subtitle{Edition 2.0.17, May 2008} +@subtitle{Edition 2.0.18, May 2008} @author{Stefan Weyergraf, Sebastian Biallas} @c The following two commands start the copyright page. @@ -78,7 +78,7 @@ be registered in certain jurisdictions. @c @macro htversion -2.0.17 +2.0.18 @end macro @macro hturl diff --git a/hteval.cc b/hteval.cc index 7556236..b764dbf 100644 --- a/hteval.cc +++ b/hteval.cc @@ -308,7 +308,7 @@ static void do_eval(ht_strinputfield *s, ht_statictext *t, const char *b, eval_f } case SCALAR_FLOAT: { char buf1[1024]; - x.appendFormat("val %.20f\nnorm %.20e", r.scalar.floatnum.value, r.scalar.floatnum.value); + sprintf(buf1, "val %.20f\nnorm %.20e", r.scalar.floatnum.value, r.scalar.floatnum.value); // FIXME: endianess/hardware format float ff = ((float)r.scalar.floatnum.value); uint32 f; diff --git a/htinfo.h b/htinfo.h index fb55ac3..cc47708 100644 --- a/htinfo.h +++ b/htinfo.h @@ -24,7 +24,7 @@ #define ht_url "http://hte.sourceforge.net" #define ht_name "ht" -#define ht_version "2.0.17" +#define ht_version "2.0.18" #define ht_author1 "Stefan Weyergraf" #define ht_copyright1 "(c) 1999-2004 "ht_author1 From 2d19b1a1c2c26580b7658411662704eb72a8c8de Mon Sep 17 00:00:00 2001 From: seppel Date: Thu, 27 Aug 2009 14:31:35 +0000 Subject: [PATCH 11/53] . --- ChangeLog | 1 + htapp.cc | 12 ++++-------- htapp.h | 2 +- htctrl.cc | 2 +- htctrl.h | 2 +- htelfimg.cc | 16 +++++++--------- 6 files changed, 15 insertions(+), 20 deletions(-) diff --git a/ChangeLog b/ChangeLog index f579fda..1753a27 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5,6 +5,7 @@ version 2.0.18: - updated c++ demangler - [x86] SSE5/XOP/AVX merge - symbols "first" and "last" in hex view + - project manager works again version 2.0.17: - compilation fixes for gcc 4.4 diff --git a/htapp.cc b/htapp.cc index 6d57805..7a99e80 100644 --- a/htapp.cc +++ b/htapp.cc @@ -557,14 +557,12 @@ void file_window_store_fcfg_func(ObjectStream &f, void *context) void file_project_store_fcfg_func(ObjectStream &f, void *context) { - PUT_OBJECT(f, (Object*)project); + PUT_OBJECT(f, project); } void file_project_load_fcfg_func(ObjectStream &f, void *context) { - Object *p; - GET_OBJECT(f, p); - project = p; + GET_OBJECT(f, project); } /* @@ -2042,9 +2040,7 @@ ht_window *ht_app::create_window_project() get_stdbounds_tool(&b); ht_project_window *project_window=new ht_project_window(); - ht_project *p = (ht_project *)project; - project_window->init(&b, "project window", FS_KILLER | FS_TITLE | FS_NUMBER | FS_MOVE | FS_RESIZE, 0, &p); - project = p; + project_window->init(&b, "project window", FS_KILLER | FS_TITLE | FS_NUMBER | FS_MOVE | FS_RESIZE, 0, (ht_project**)&project); Bounds k = b; k.x = b.w-2; @@ -2968,7 +2964,7 @@ void ht_app::project_opencreate(const char *filename) strcat(fn, HT_PROJECT_CONFIG_SUFFIX); } - void *old_project = project; + Object *old_project = project; project = NULL; String einfo; diff --git a/htapp.h b/htapp.h index 0a598b8..e1aff12 100644 --- a/htapp.h +++ b/htapp.h @@ -114,7 +114,7 @@ class ht_log: public Array { uint maxlinecount; void deletefirstline(); - void insertline(LogColor c, char *line); + void insertline(LogColor c, char *line); public: ht_log(); /* new */ diff --git a/htctrl.cc b/htctrl.cc index 9349f2a..35d17bf 100644 --- a/htctrl.cc +++ b/htctrl.cc @@ -28,7 +28,7 @@ ht_view *baseview; SystemDisplay *screen; char appname[HT_NAME_MAX+1]; List *virtual_fs_list; -void *project; +Object *project; int some_analyser_active = 0; int num_ops_parsed = 0; diff --git a/htctrl.h b/htctrl.h index f2c577e..10afbf1 100644 --- a/htctrl.h +++ b/htctrl.h @@ -31,7 +31,7 @@ extern ht_view *app; extern ht_view *baseview; extern SystemDisplay *screen; extern List *virtual_fs_list; -extern void *project; +extern Object *project; extern char appname[HT_NAME_MAX+1]; extern int some_analyser_active; extern int num_ops_parsed; diff --git a/htelfimg.cc b/htelfimg.cc index 2fb173f..64673cc 100644 --- a/htelfimg.cc +++ b/htelfimg.cc @@ -107,7 +107,7 @@ static ht_view *htelfimage_init(Bounds *b, File *file, ht_format_group *group) delete analy; v->done(); delete v; - head->done(); + head->done(); delete head; g->done(); delete g; @@ -123,14 +123,12 @@ static ht_view *htelfimage_init(Bounds *b, File *file, ht_format_group *group) Address *tmpaddr = NULL; switch (elf_shared->ident.e_ident[ELF_EI_CLASS]) { - case ELFCLASS32: { - tmpaddr = p->createAddress32(elf_shared->header32.e_entry); - break; - } - case ELFCLASS64: { - tmpaddr = p->createAddress64(elf_shared->header64.e_entry); - break; - } + case ELFCLASS32: + tmpaddr = p->createAddress32(elf_shared->header32.e_entry); + break; + case ELFCLASS64: + tmpaddr = p->createAddress64(elf_shared->header64.e_entry); + break; } v->gotoAddress(tmpaddr, NULL); From 2ceecee211a5997b3a66a2cc414591d165e12d01 Mon Sep 17 00:00:00 2001 From: seppel Date: Sat, 21 Nov 2009 20:08:38 +0000 Subject: [PATCH 12/53] . --- ChangeLog | 1 + asm/x86asm.cc | 13 +++++-- asm/x86dis.cc | 81 +++++++++++++++++++--------------------- asm/x86opc.cc | 100 +++++++++++++++++++++++++++++++++++++++++++++++--- asm/x86opc.h | 21 +++++++---- htmacho.cc | 2 +- 6 files changed, 156 insertions(+), 62 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1753a27..73c58fd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,7 @@ version 2.0.18: - updated c++ demangler - [x86] SSE5/XOP/AVX merge + - [x86] AMD LWP instructions - symbols "first" and "last" in hex view - project manager works again diff --git a/asm/x86asm.cc b/asm/x86asm.cc index afa82fe..548dd11 100644 --- a/asm/x86asm.cc +++ b/asm/x86asm.cc @@ -142,7 +142,7 @@ static const byte lop2hop[12][9] = { /* X86_OPTYPE_IMM */ {TYPE_I, TYPE_Is, TYPE_J, TYPE_A, TYPE_Ix, TYPE_I4}, /* X86_OPTYPE_REG */ - {TYPE_R, TYPE_Rx, TYPE_RXx, TYPE_G, TYPE_E, TYPE_MR}, + {TYPE_R, TYPE_Rx, TYPE_RXx, TYPE_G, TYPE_E, TYPE_MR, TYPE_RV}, /* X86_OPTYPE_SEG */ {TYPE_S, TYPE_Sx}, /* X86_OPTYPE_MEM */ @@ -705,7 +705,7 @@ bool x86asm::encode_vex_insn(x86asm_insn *insn, x86opc_vex_insn *opcode, int opc } if ((opcode->vex & 0x3c) == 0x4 // 0x0f-opcode - && !(rexprefix & 3) // no rexb/rexx + && !(rexprefix & 3) // no rexb/rexx && !(opcode->vex & W1)) { // use short vex prefix emitbyte(0xc5); @@ -716,7 +716,7 @@ bool x86asm::encode_vex_insn(x86asm_insn *insn, x86opc_vex_insn *opcode, int opc emitbyte(vex); } else { // use long vex/xop prefix - if (opcode->vex & (_0f24|_0f25)) { + if (opcode->vex & _0f24) { emitbyte(0x8f); } else { emitbyte(0xc4); @@ -990,6 +990,7 @@ bool x86asm::encode_op(x86_insn_op *op, x86opc_insn_op *xop, int *esize, int eop break; case TYPE_R: /* rm of ModR/M picks general register */ + emitmodrm_mod(3); emitmodrm_rm(op->reg); // fall throu case TYPE_Rx: @@ -998,6 +999,10 @@ bool x86asm::encode_op(x86_insn_op *op, x86opc_insn_op *xop, int *esize, int eop case TYPE_RXx: /* extra picks register, no REX */ return true; + case TYPE_RV: + /* VEX.vvvv picks general register */ + vexvvvv = op->reg; + return true; case TYPE_S: /* reg of ModR/M picks segment register */ emitmodrm_reg(op->seg); @@ -1044,7 +1049,7 @@ bool x86asm::encode_op(x86_insn_op *op, x86opc_insn_op *xop, int *esize, int eop if (drexoc0 == 0) { emitmodrm_mod(3); emitmodrm_rm(op->xmm); - if (op->xmm > 7) rexprefix |= rexb; + if (op->xmm > 7) rexprefix |= rexb; } else { emitmodrm_reg(op->xmm); if (op->xmm > 7) rexprefix |= rexr; diff --git a/asm/x86dis.cc b/asm/x86dis.cc index 8266b07..05c9af2 100644 --- a/asm/x86dis.cc +++ b/asm/x86dis.cc @@ -3,7 +3,7 @@ * x86dis.cc * * Copyright (C) 1999-2002 Stefan Weyergraf - * Copyright (C) 2005-2008 Sebastian Biallas (sb@biallas.net) + * Copyright (C) 2005-2009 Sebastian Biallas (sb@biallas.net) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -47,7 +47,6 @@ #define vexb(vex) (!((vex)&0x20)) #define vexl(vex) (!!((vex)&0x04)) -#define vexmmmm(vex) ((vex)&0xf) #define vexmmmmm(vex) ((vex)&0x1f) #define vexvvvv(vex) (((~(vex))>>3)&0xf) #define vexpp(vex) ((vex)&0x3) @@ -136,12 +135,12 @@ uint x86dis::mkreg(uint modrm) uint x86dis::mkindex(uint sib) { - return (sib>>3 & 0x07) | !!rexx(insn.rexprefix) << 3; + return (sib>>3 & 0x07) | !!rexx(insn.rexprefix) << 3; } uint x86dis::mkrm(uint modrm) { - return (modrm & 0x07) | !!rexb(insn.rexprefix) << 3; + return (modrm & 0x07) | !!rexb(insn.rexprefix) << 3; } static bool is_xmm_op(x86dis_insn *insn, char size) @@ -219,13 +218,13 @@ void x86dis::decode_modrm(x86_insn_op *op, char size, bool allow_reg, bool allow } } } else { - if (mod == 0 && rm == 5) { + if (mod == 0 && (rm & 7) == 5) { op->mem.hasdisp = true; op->mem.disp = disp; op->mem.base = X86_REG_NO; op->mem.index = X86_REG_NO; op->mem.scale = 0; - } else if (rm == 4) { + } else if ((rm & 7) == 4) { decode_sib(op, mod); } else { op->mem.base = rm; @@ -317,7 +316,7 @@ void x86dis::decode_vex_insn(x86opc_vex_insn *xinsn) case TYPE_W: case TYPE_X: /* get whole modrm/sib/disp stuff first - * (otherwise a TYPE_VI immediate might + * (otherwise a TYPE_VI immediate might * get fetched fetched before the modrm stuff) */ getdisp(); @@ -411,19 +410,19 @@ void x86dis::decode_insn(x86opc_insn *xinsn) if (c == 0xc5) { // 2 byte vex insn.vexprefix.mmmm = 1; + insn.vexprefix.w = 0; } else { // 3 byte vex / xop insn.rexprefix |= vexx(vex) << 1; insn.rexprefix |= vexb(vex); + insn.vexprefix.mmmm = vexmmmmm(vex); if (c == 0x8f) { - insn.vexprefix.mmmm |= vexmmmmm(vex); - if (insn.vexprefix.mmmm != 8 - && insn.vexprefix.mmmm != 9) { + if (insn.vexprefix.mmmm < 8 + || insn.vexprefix.mmmm > 10) { invalidate(); break; } } else { - insn.vexprefix.mmmm |= vexmmmm(vex); if (insn.vexprefix.mmmm == 0 || insn.vexprefix.mmmm > 3) { invalidate(); @@ -431,7 +430,7 @@ void x86dis::decode_insn(x86opc_insn *xinsn) } } vex = getbyte(); - insn.vexprefix.w |= vexw(vex); + insn.vexprefix.w = vexw(vex); } insn.vexprefix.vvvv = vexvvvv(vex); insn.vexprefix.l = vexl(vex); @@ -742,9 +741,13 @@ void x86dis::decode_op(x86_insn_op *op, x86opc_insn_op *xop) } case TYPE_R: { /* rm of ModR/M picks general register */ - op->type = X86_OPTYPE_REG; - op->size = esizeop(xop->size); - op->reg = mkrm(getmodrm()); + if (mkmod(getmodrm()) == 3) { + op->type = X86_OPTYPE_REG; + op->size = esizeop(xop->size); + op->reg = mkrm(getmodrm()); + } else { + invalidate(); + } break; } case TYPE_Rx: { @@ -761,6 +764,13 @@ void x86dis::decode_op(x86_insn_op *op, x86opc_insn_op *xop) op->reg = xop->extra; break; } + case TYPE_RV: { + /* VEX.vvvv picks general register */ + op->type = X86_OPTYPE_REG; + op->size = esizeop(xop->size); + op->reg = insn.vexprefix.vvvv; + break; + } case TYPE_S: { /* reg of ModR/M picks segment register */ op->type = X86_OPTYPE_SEG; @@ -997,6 +1007,7 @@ void x86dis::filloffset(CPU_ADDR &addr, uint64 offset) uint32 x86dis::getdisp() { if (have_disp) return disp; + disp = 0; have_disp = true; int modrm = getmodrm(); int mod = mkmod(modrm); @@ -1007,42 +1018,24 @@ uint32 x86dis::getdisp() disp = getword(); } else { switch (mod) { - case 1: - disp = getbyte(); - break; - case 2: - disp = getword(); - break; + case 1: disp = getbyte(); break; + case 2: disp = getword(); break; } } } else { + rm &= 7; if (mod == 0 && rm == 5) { - disp = getdword(); + mod = 2; } else if (rm == 4) { - int sib = getsib(); - int base = mkbase(sib); - int d = mod; - if ((base & 0x7) == 5 && mod == 0) { - d = 2; - } - switch (d) { - case 1: - disp = getbyte(); - break; - case 2: - disp = getdword(); - break; - } - } else { - switch (mod) { - case 1: - disp = getbyte(); - break; - case 2: - disp = getdword(); - break; + int base = mkbase(getsib()) & 7; + if (mod == 0 && base == 5) { + mod = 2; } } + switch (mod) { + case 1: disp = getbyte(); break; + case 2: disp = getdword(); break; + } } return disp; } diff --git a/asm/x86opc.cc b/asm/x86opc.cc index 6ab584c..1699d91 100644 --- a/asm/x86opc.cc +++ b/asm/x86opc.cc @@ -3,7 +3,7 @@ * x86opc.cc * * Copyright (C) 1999-2002 Stefan Weyergraf - * Copyright (C) 2005-2008 Sebastian Biallas (sb@biallas.net) + * Copyright (C) 2005-2009 Sebastian Biallas (sb@biallas.net) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -67,7 +67,9 @@ x86opc_insn_op x86_op_type[] = { {TYPE_I, 0, 0, SIZE_B}, #define Iw Ib+1 {TYPE_I, 0, 0, SIZE_W}, -#define Iv Iw+1 +#define Id Iw+1 +{TYPE_I, 0, 0, SIZE_D}, +#define Iv Id+1 {TYPE_I, 0, 0, SIZE_VV}, #define Iv64 Iv+1 {TYPE_I, 0, INFO_DEFAULT_64, SIZE_VV}, @@ -145,11 +147,21 @@ x86opc_insn_op x86_op_type[] = { {TYPE_Q, 0, 0, SIZE_Z}, #define Rw Qz+1 {TYPE_R, 0, 0, SIZE_W}, -#define Rr Rw+1 +#define Rd Rw+1 +{TYPE_R, 0, 0, SIZE_D}, +#define Rq Rd+1 +{TYPE_R, 0, 0, SIZE_Q}, +#define Rr Rq+1 {TYPE_R, 0, 0, SIZE_R}, #define Rr64 Rr+1 {TYPE_R, 0, INFO_DEFAULT_64, SIZE_R}, -#define Sw Rr64+1 +#define RVw Rr64+1 +{TYPE_RV, 0, 0, SIZE_W}, +#define RVd RVw+1 +{TYPE_RV, 0, 0, SIZE_D}, +#define RVq RVd+1 +{TYPE_RV, 0, 0, SIZE_Q}, +#define Sw RVq+1 {TYPE_S, 0, 0, SIZE_W}, #define Vd Sw+1 @@ -426,6 +438,12 @@ const char *x86_segs[8] = { #define GROUP_660F71 1 #define GROUP_660F72 2 #define GROUP_660F73 3 +#define GROUP_0F25 4 +#define GROUP_0F25_L 5 +#define GROUP_0F25_W 6 +#define GROUP_0FA 7 +#define GROUP_0FA_L 8 +#define GROUP_0FA_W 9 /* @@ -556,7 +574,7 @@ x86opc_insn x86_32_insns[256] = { {"?pusha|pushad| x"}, {"?popa|popad| x"}, {"bound", {Gv, Mq}}, -{"arpl", {Ew, Rw}}, //{"movsxd", {Gv, Ed}}, +{"arpl", {Ew, Gw}}, //{"movsxd", {Gv, Ed}}, {0, {SPECIAL_TYPE_PREFIX}}, /* fs-prefix */ {0, {SPECIAL_TYPE_PREFIX}}, /* gs-prefix */ {0, {SPECIAL_TYPE_PREFIX}}, /* op-size prefix */ @@ -3416,6 +3434,12 @@ E(11) {"vmovupd", _128|_66|_0f, {Wo, Vo}}, {"vmovupd", _256|_66|_0f, {Xy, Yy}}, E(12) +{0, _128|_0f25|W0, {SPECIAL_TYPE_GROUP, GROUP_0F25}}, +{0, _128|_0f25|W1, {SPECIAL_TYPE_GROUP, GROUP_0F25_W}}, +{0, _256|_0f25|W0, {SPECIAL_TYPE_GROUP, GROUP_0F25_L}}, +{0, _128|_0fA|W0, {SPECIAL_TYPE_GROUP, GROUP_0FA}}, +{0, _128|_0fA|W1, {SPECIAL_TYPE_GROUP, GROUP_0FA_W}}, +{0, _256|_0fA|W0, {SPECIAL_TYPE_GROUP, GROUP_0FA_L}}, {"vmovddup", _128|_f2|_0f, {Vo, Wq}}, {"vmovddup", _256|_f2|_0f, {Yy, Xy}}, {"vmovhlps", _128|_0f, {Vo, VVo, VRo}}, @@ -4230,6 +4254,72 @@ x86opc_vex_insn x86_group_vex_insns[][8] = { {"vpsllq", _128|_66|_0f, {VVo, VRo, Ib}}, {"vpslldq", _128|_66|_0f, {VVo, VRo, Ib}}, }, +/* 4 - GROUP_0F2512 */ +{ +{"llwpcb", _128|_0f25|W0, {Rw}}, +{"slwpcb", _128|_0f25|W0, {Rw}}, +{0}, +{0}, +{0}, +{0}, +{0}, +{0}, +}, +/* 5 - GROUP_0F2512_L */ +{ +{"llwpcb", _256|_0f25|W0, {Rd}}, +{"slwpcb", _256|_0f25|W0, {Rd}}, +{0}, +{0}, +{0}, +{0}, +{0}, +{0}, +}, +/* 6 - GROUP_0F2512_W */ +{ +{"llwpcb", _128|_0f25|W1, {Rq}}, +{"slwpcb", _128|_0f25|W1, {Rq}}, +{0}, +{0}, +{0}, +{0}, +{0}, +{0}, +}, +/* 7 - GROUP_0FA */ +{ +{"lwpins", _128|_0fA, {RVw, Ed, Iw}}, +{"lwpval", _128|_0fA, {RVw, Ed, Iw}}, +{0}, +{0}, +{0}, +{0}, +{0}, +{0}, +}, +/* 8 - GROUP_0FA_L */ +{ +{"lwpins", _256|_0fA, {RVd, Ed, Id}}, +{"lwpval", _256|_0fA, {RVd, Ed, Id}}, +{0}, +{0}, +{0}, +{0}, +{0}, +{0}, +}, +/* 9 - GROUP_0FA_W */ +{ +{"lwpins", _128|_0fA|W1, {RVq, Ed, Id}}, +{"lwpval", _128|_0fA|W1, {RVq, Ed, Id}}, +{0}, +{0}, +{0}, +{0}, +{0}, +{0}, +}, }; x86opc_vex_insn *x86_vex_insns[256] = { diff --git a/asm/x86opc.h b/asm/x86opc.h index 581903c..2d17cc7 100644 --- a/asm/x86opc.h +++ b/asm/x86opc.h @@ -134,6 +134,7 @@ enum { TYPE_R, /* rm of ModR/M picks general register */ TYPE_Rx, /* extra picks register */ TYPE_RXx, /* extra picks register, no REX extension */ + TYPE_RV, /* VEX.vvvv picks general register */ TYPE_S, /* reg of ModR/M picks segment register */ TYPE_Sx, /* extra picks segment register */ @@ -145,7 +146,7 @@ enum { TYPE_W, /* ModR/M (XMM reg or memory) */ TYPE_Y, /* reg of ModR/M picks YMM register */ - TYPE_YV, /* VEX.vvvv pick YMM register */ + TYPE_YV, /* VEX.vvvv picks YMM register */ TYPE_YI, /* bits 7-4 of imm picks YMM register */ TYPE_YR, /* rm of ModR/M picks YMM register */ TYPE_X, /* ModR/M (YMM reg or memory) */ @@ -165,12 +166,16 @@ enum X86_VEX { _f3 = 0x02, _f2 = 0x03, - _0f = 0x04, - _0f38 = 0x08, - _0f3a = 0x0c, - - _0f24 = 0x20, - _0f25 = 0x24, + _0f = 0x04, // mmmm = 1 + _0f38 = 0x08, // mmmm = 2 + _0f3a = 0x0c, // mmmm = 3 +// _0f4 = 0x10, // mmmm = 4 +// _0f5 = 0x14, // mmmm = 5 +// _0f6 = 0x18, // mmmm = 6 +// _0f7 = 0x1c, // mmmm = 7 + _0f24 = 0x20, // mmmm = 8 + _0f25 = 0x24, // mmmm = 9 + _0fA = 0x28, // mmmm = 10 }; /* when name is == 0, the first op has a special meaning (layout see x86_insn_op_special) */ @@ -230,7 +235,7 @@ struct x86_64_insn_patch { /* this can be a group (group!=0), an insn (group==0) && (insn.name!=0) or (otherwise) a reserved instruction. */ struct x86opc_finsn { - x86opc_insn *group; + x86opc_insn *group; x86opc_insn insn; }; diff --git a/htmacho.cc b/htmacho.cc index 83b5063..4e095ae 100644 --- a/htmacho.cc +++ b/htmacho.cc @@ -109,7 +109,7 @@ void ht_macho::init(Bounds *b, File *f, format_viewer_if **ifs, ht_format_group file->seek(ofs); file->read(&cmd, sizeof cmd); createHostStruct(&cmd, MACHO_COMMAND_struct, image_endianess); - if (cmd.cmdsize > 1024) break; + if (cmd.cmdsize > 1024*1024) break; macho_shared->cmds.cmds[i] = ht_malloc(cmd.cmdsize); file->seek(ofs); if (file->read(macho_shared->cmds.cmds[i], cmd.cmdsize) != cmd.cmdsize) { From 48f5d8b17fa80d62817fc8446b7db9a7e05f8577 Mon Sep 17 00:00:00 2001 From: seppel Date: Sat, 9 Jan 2010 12:52:49 +0000 Subject: [PATCH 13/53] file autogen.sh was added on branch ht_2_0_branch on 2011-08-20 12:54:51 +0000 From a173da36bb76fdd6ef3612c7550d6b8a03cd5fec Mon Sep 17 00:00:00 2001 From: seppel Date: Fri, 22 Jan 2010 23:53:39 +0000 Subject: [PATCH 14/53] . --- ChangeLog | 5 +++++ asm/x86asm.cc | 39 ++++++++++++++++++++------------------- asm/x86dis.cc | 45 +++++++++++++++------------------------------ asm/x86opc.cc | 41 ++++++++++++++++++++++------------------- configure.in | 2 +- doc/ht.texi | 4 ++-- htanaly.cc | 14 ++++++++------ htinfo.h | 2 +- 8 files changed, 74 insertions(+), 78 deletions(-) diff --git a/ChangeLog b/ChangeLog index 73c58fd..75b610b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,11 @@ HT ChangeLog ============== +version 2.0.19: + - [x86] fixed a lot of small bugs + - fixed a crash with the "follow" function on + invalid addresses in analyser + version 2.0.18: - updated c++ demangler - [x86] SSE5/XOP/AVX merge diff --git a/asm/x86asm.cc b/asm/x86asm.cc index 548dd11..662e199 100644 --- a/asm/x86asm.cc +++ b/asm/x86asm.cc @@ -688,6 +688,15 @@ bool x86asm::encode_vex_insn(x86asm_insn *insn, x86opc_vex_insn *opcode, int opc clearcode(); return false; } + + if (addrsize == X86_ADDRSIZE64) { + if (eaddrsize == X86_ADDRSIZE16) return false; + if (eaddrsize == X86_ADDRSIZE32) emitbyte(0x67); + } else { + if (eaddrsize != addrsize) emitbyte(0x67); + } + + switch (insn->segprefix) { case X86_PREFIX_ES: emitbyte(0x26); break; case X86_PREFIX_CS: emitbyte(0x2e); break; @@ -842,9 +851,10 @@ bool x86asm::encode_modrm_v(const x86addrcoding (*modrmc)[3][8], x86_insn_op *op if (op->mem.scale > 1) return false; for (int mod=0; mod < 3; mod++) { for (int rm=0; rm < 8; rm++) { - const x86addrcoding *c=&(*modrmc)[mod][rm]; - int r1=c->reg1, r2=c->reg2; - if (r2 == (op->mem.base&~8)) { + const x86addrcoding *c = &(*modrmc)[mod][rm]; + int r1 = c->reg1; + int r2 = c->reg2; + if (r2 == (op->mem.base & ~8)) { int t = r1; r1 = r2; r2 = t; @@ -1137,25 +1147,16 @@ bool x86asm::encode_sib_v(x86_insn_op *op, int mindispsize, int *_ss, int *_inde } if (index != X86_REG_NO) { switch (scale) { - case 1: - ss = 0; - break; - case 2: - ss = 1; - break; - case 4: - ss = 2; - break; - case 8: - ss = 3; - break; - default: - return 0; - } + case 1: ss = 0; break; + case 2: ss = 1; break; + case 4: ss = 2; break; + case 8: ss = 3; break; + default: return 0; + } } else { ss = 0; index = 4; - } + } switch (mindispsize) { case 0: mod = 0; diff --git a/asm/x86dis.cc b/asm/x86dis.cc index 05c9af2..37704ce 100644 --- a/asm/x86dis.cc +++ b/asm/x86dis.cc @@ -385,7 +385,7 @@ void x86dis::decode_insn(x86opc_insn *xinsn) case 0xc5: { byte vex = getbyte(); if (c == 0x8f) { - if ((vex & 0x08) == 0) { + if ((vex & 0x38) == 0) { modrm = vex; decode_insn(&x86_pop_group); break; @@ -417,8 +417,8 @@ void x86dis::decode_insn(x86opc_insn *xinsn) insn.rexprefix |= vexb(vex); insn.vexprefix.mmmm = vexmmmmm(vex); if (c == 0x8f) { - if (insn.vexprefix.mmmm < 8 - || insn.vexprefix.mmmm > 10) { + if (insn.vexprefix.mmmm > 10) { + // insn.vexprefix.mmmm >= 8 is implied invalidate(); break; } @@ -638,30 +638,21 @@ void x86dis::decode_op(x86_insn_op *op, x86opc_insn_op *xop) /* relative branch offset */ op->type = X86_OPTYPE_IMM; switch (addrsize) { - case X86_ADDRSIZE16: - op->size = 2; - break; - case X86_ADDRSIZE32: - op->size = 4; - break; - case X86_ADDRSIZE64: - op->size = 8; - break; + case X86_ADDRSIZE16: op->size = 2; break; + case X86_ADDRSIZE32: op->size = 4; break; + case X86_ADDRSIZE64: op->size = 8; break; default: {assert(0);} } int s = esizeop(xop->size); sint64 addr = getoffset() + (codep - ocodep); switch (s) { - case 1: - op->imm = sint8(getbyte()) + addr + 1; - break; - case 2: - op->imm = sint16(getword()) + addr + 2; - break; + case 1: op->imm = sint8(getbyte()) + addr + 1; break; + case 2: op->imm = sint16(getword()) + addr + 2; break; case 4: - case 8: - op->imm = sint32(getdword()) + addr + 4; - break; + case 8: op->imm = sint32(getdword()) + addr + 4; break; + } + if (insn.eopsize == X86_OPSIZE16) { + op->imm &= 0xffff; } break; } @@ -690,15 +681,9 @@ void x86dis::decode_op(x86_insn_op *op, x86opc_insn_op *xop) op->mem.addrsize = insn.eaddrsize; op->mem.hasdisp = true; switch (insn.eaddrsize) { - case X86_ADDRSIZE16: - op->mem.disp = getword(); - break; - case X86_ADDRSIZE32: - op->mem.disp = getdword(); - break; - case X86_ADDRSIZE64: - op->mem.disp = getqword(); - break; + case X86_ADDRSIZE16: op->mem.disp = getword(); break; + case X86_ADDRSIZE32: op->mem.disp = getdword(); break; + case X86_ADDRSIZE64: op->mem.disp = getqword(); break; default: {assert(0);} } op->mem.base = X86_REG_NO; diff --git a/asm/x86opc.cc b/asm/x86opc.cc index 1699d91..a8c4d5a 100644 --- a/asm/x86opc.cc +++ b/asm/x86opc.cc @@ -3,7 +3,7 @@ * x86opc.cc * * Copyright (C) 1999-2002 Stefan Weyergraf - * Copyright (C) 2005-2009 Sebastian Biallas (sb@biallas.net) + * Copyright (C) 2005-2010 Sebastian Biallas (sb@biallas.net) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -119,7 +119,9 @@ x86opc_insn_op x86_op_type[] = { {TYPE_MR, SIZE_R, 0, SIZE_B}, #define MRwr MRbr+1 {TYPE_MR, SIZE_R, 0, SIZE_W}, -#define MRdr MRwr+1 +#define MRwv MRwr+1 +{TYPE_MR, SIZE_V, 0, SIZE_W}, +#define MRdr MRwv+1 {TYPE_MR, SIZE_R, 0, SIZE_D}, #define MRbd MRdr+1 {TYPE_MR, SIZE_D, 0, SIZE_B}, @@ -620,9 +622,9 @@ x86opc_insn x86_32_insns[256] = { {"mov", {Ev, Gv}}, {"mov", {Gb, Eb}}, {"mov", {Gv, Ev}}, -{"mov", {Ev, Sw}}, +{"mov", {MRwv, Sw}}, {"lea", {Gv, M}}, -{"mov", {Sw, Ev}}, +{"mov", {Sw, MRwv}}, {0, {SPECIAL_TYPE_PREFIX}}, // XOP prefix {0, {SPECIAL_TYPE_GROUP, GROUP_8F}}, /* 90 */ {"nop"}, /* same as xchg (e)ax, (e)ax */ @@ -2770,12 +2772,12 @@ x86opc_insn x86_group_insns[][8] = { }, /* 16 - GROUP_EXT_00 */ { -{"sldt", {Ew}}, -{"str", {Ew}}, -{"lldt", {Ew}}, -{"ltr", {Ew}}, -{"verr", {Ew}}, -{"verw", {Ew}}, +{"sldt", {MRwv}}, +{"str", {MRwv}}, +{"lldt", {MRwv}}, +{"ltr", {MRwv}}, +{"verr", {MRwv}}, +{"verw", {MRwv}}, {0}, {0}, }, @@ -2785,9 +2787,9 @@ x86opc_insn x86_group_insns[][8] = { {0, {SPECIAL_TYPE_SGROUP, GROUP_SPECIAL_0F01_1}}, {0, {SPECIAL_TYPE_SGROUP, GROUP_SPECIAL_0F01_2}}, {0, {SPECIAL_TYPE_SGROUP, GROUP_SPECIAL_0F01_3}}, -{"smsw", {Ew}}, +{"smsw", {MRwv}}, {0}, -{"lmsw", {Ew}}, +{"lmsw", {MRwv}}, {0, {SPECIAL_TYPE_SGROUP, GROUP_SPECIAL_0F01_7}}, }, /* 18 - GROUP_EXT_18 */ @@ -3593,7 +3595,6 @@ E(42) {"vmpsadbw", _128|_66|_0f3a, {Vo, VVo, Wo, Ib}}, E(44) {"vpclmulqdq", _128|_66|_0f3a, {Vo, VVo, Wo, Ib}}, -/* E(48) {"vpermil2ps", _128|_66|_0f3a|W0, {Vo, VVo, Wo, VIo, I4}}, {"vpermil2ps", _128|_66|_0f3a|W1, {Vo, VVo, VIo, Wo, I4}}, @@ -3604,7 +3605,6 @@ E(49) {"vpermil2pd", _128|_66|_0f3a|W1, {Vo, VVo, VIo, Wo, I4}}, {"vpermil2pd", _256|_66|_0f3a|W0, {Yy, YVy, Xy, YIy, I4}}, {"vpermil2pd", _256|_66|_0f3a|W1, {Yy, YVy, YIy, Xy, I4}}, -*/ E(4a) {"vblendvps", _128|_66|_0f3a, {Vo, VVo, Wo, VIo}}, {"vblendvps", _256|_66|_0f3a, {Yy, YVy, Xy, YIy}}, @@ -4073,6 +4073,9 @@ E(c6) {"vshufps", _256|_0f, {Yy, YVy, Xy, Ib}}, {"vshufpd", _128|_66|_0f, {Vo, VVo, Wo, Ib}}, {"vshufpd", _256|_66|_0f, {Yy, YVy, Xy, Ib}}, +{"vphadddwd", _128|_0f25, {Vo, Wo}}, +E(c7) +{"vphadddwq", _128|_0f25, {Vo, Wo}}, E(cb) {"vphadddq", _128|_0f25, {Vo, Wo}}, E(cc) @@ -4110,7 +4113,6 @@ E(d7) {"vphaddwq", _128|_0f25, {Vo, Wo}}, // FIXME E(d8) {"vpsubusb", _128|_66|_0f, {Vo, VVo, Wo}}, -{"vphaddudq", _128|_0f25, {Vo, Wo}}, E(d9) {"vpsubusw", _128|_66|_0f, {Vo, VVo, Wo}}, E(da) @@ -4118,6 +4120,7 @@ E(da) E(db) {"vpand", _128|_66|_0f, {Vo, VVo, Wo}}, {"vaesimc", _128|_66|_0f38, {Vo, Wo}}, +{"vphaddudq", _128|_0f25, {Vo, Wo}}, E(dc) {"vpaddusb", _128|_66|_0f, {Vo, VVo, Wo}}, {"vaesenc", _128|_66|_0f38, {Vo, VVo, Wo}}, @@ -4332,7 +4335,7 @@ v28, v29, v2a, v2b, v2c, v2d, v2e, v2f, v30, v31, v32, v33, v34, v35, 0, v37, v38, v39, v3a, v3b, v3c, v3d, v3e, v3f, v40, v41, v42, 0, v44, 0, 0, 0, - 0, 0, v4a, v4b, v4c, 0, 0, 0, +v48, v49, v4a, v4b, v4c, 0, 0, 0, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v5a, v5b, v5c, v5d, v5e, v5f, v60, v61, v62, v63, v64, v65, v66, v67, @@ -4343,11 +4346,11 @@ v80, v81, v82, v83, 0, v85, v86, v87, 0, 0, 0, 0, 0, 0, v8e, v8f, v90, v91, v92, v93, v94, v95, v96, v97, v98, v99, v9a, v9b, v9c, v9d, v9e, v9f, -va0, va1, va2, 0, 0, 0, va6, va7, +va0, va1, va2, va3, 0, 0, va6, va7, va8, va9, vaa, vab, vac, vad, vae, vaf, - 0, 0, 0, va3, 0, 0, vb6, vb7, + 0, 0, 0, 0, 0, 0, vb6, vb7, vb8, vb9, vba, vbb, vbc, vbd, vbe, vbf, -vc0, vc1, vc2, vc3, vc4, vc5, vc6, 0, +vc0, vc1, vc2, vc3, vc4, vc5, vc6, vc7, 0, 0, 0, vcb, vcc, vcd, vce, vcf, vd0, vd1, vd2, vd3, vd4, vd5, vd6, vd7, vd8, vd9, vda, vdb, vdc, vdd, vde, vdf, diff --git a/configure.in b/configure.in index 6b9ba92..3c45bee 100644 --- a/configure.in +++ b/configure.in @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. -AC_INIT(ht,[2.0.18],[https://sourceforge.net/tracker/?group_id=1066]) +AC_INIT(ht,[2.0.19],[https://sourceforge.net/tracker/?group_id=1066]) AC_PREREQ(2.59) dnl Check the system. diff --git a/doc/ht.texi b/doc/ht.texi index 8143588..e86b6ee 100644 --- a/doc/ht.texi +++ b/doc/ht.texi @@ -51,7 +51,7 @@ be registered in certain jurisdictions. @titlepage @title{HT Manual} -@subtitle{Edition 2.0.18, May 2008} +@subtitle{Edition 2.0.19, May 2008} @author{Stefan Weyergraf, Sebastian Biallas} @c The following two commands start the copyright page. @@ -78,7 +78,7 @@ be registered in certain jurisdictions. @c @macro htversion -2.0.18 +2.0.19 @end macro @macro hturl diff --git a/htanaly.cc b/htanaly.cc index a3174e9..be0aa32 100644 --- a/htanaly.cc +++ b/htanaly.cc @@ -488,7 +488,7 @@ void AnalyInfoline::update(Address *cursor_addr, FileOfs ecursor_addr) bool AnalyInfoline::valid() { - return ((analy)&&(analy->analy)); + return analy && analy->analy; } /* @@ -798,7 +798,6 @@ void ht_aviewer::generateOutputDialog() char filename[260]; char start_str[1024], end_str[1024]; viewer_pos start, end; - bool by_lines; output_dialog_data odd; ViewDataBuf vdb(dialog, &odd, sizeof odd); getdatastr(&odd.id1, filename); @@ -829,7 +828,7 @@ void ht_aviewer::generateOutputDialog() try { String name(filename); LocalFile s(name, IOAM_WRITE, FOM_CREATE); - AnalyserOutput *out; + AnalyserOutput *out = NULL; switch (odd.lp.cursor_pos) { case 0: out = new AnalyserHTMLOutput(); @@ -1334,12 +1333,15 @@ void ht_aviewer::handlemsg(htmsg *msg) } case cmd_analyser_follow: { if (!analy) break; - Address *c, *b; + Address *c; if (!getCurrentAddress(&c)) break; - b = analy->createAddress(); + std::auto_ptr
blub(c); + if (!analy->validAddress(c, scinitialized)) break; + Address *b = analy->createAddress(); + std::auto_ptr
blub2(b); uint bz = b->byteSize(); if (!bz) break; - byte *buf = ht_malloc(bz); + byte buf[bz]; if (analy->bufPtr(c, buf, bz) != bz) break; b->getFromArray(buf); if (analy->validAddress(b, scvalid)) { diff --git a/htinfo.h b/htinfo.h index cc47708..63bd96e 100644 --- a/htinfo.h +++ b/htinfo.h @@ -24,7 +24,7 @@ #define ht_url "http://hte.sourceforge.net" #define ht_name "ht" -#define ht_version "2.0.18" +#define ht_version "2.0.19" #define ht_author1 "Stefan Weyergraf" #define ht_copyright1 "(c) 1999-2004 "ht_author1 From 1a4cd8492993c1327fe0fbc04be15dbe704282f1 Mon Sep 17 00:00:00 2001 From: seppel Date: Sat, 23 Jan 2010 18:22:25 +0000 Subject: [PATCH 15/53] . --- doc/ht.texi | 8 ++++---- htinfo.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/ht.texi b/doc/ht.texi index e86b6ee..5a5afae 100644 --- a/doc/ht.texi +++ b/doc/ht.texi @@ -23,7 +23,7 @@ END-INFO-DIR-ENTRY This file documents the HT Editor. @c -Copyright @copyright{} 1999-2009 The HT authors. @* +Copyright @copyright{} 1999-2010 The HT authors. @* @xref{Authors, The HT Authors, The HT Authors}, for a list of the copyright holders. @@ -51,14 +51,14 @@ be registered in certain jurisdictions. @titlepage @title{HT Manual} -@subtitle{Edition 2.0.19, May 2008} +@subtitle{Edition 2.0.19, January 2010} @author{Stefan Weyergraf, Sebastian Biallas} @c The following two commands start the copyright page. @page @vskip 0pt plus 1filll -Copyright @copyright{} 1999-2009 The HT authors. @* +Copyright @copyright{} 1999-2010 The HT authors. @* @xref{Authors, The HT Authors, The HT Authors}, for a list of the copyright holders. @@ -604,7 +604,7 @@ try to guess file type @unnumberedsec Where to download? @noindent -The HT homepage is at +The HT homepage is located at @hturl{} @noindent diff --git a/htinfo.h b/htinfo.h index 63bd96e..698cbd2 100644 --- a/htinfo.h +++ b/htinfo.h @@ -31,6 +31,6 @@ #define ht_author2 "Sebastian Biallas" #define ht_mail2 "sb@biallas.net" -#define ht_copyright2 "(c) 1999-2009 "ht_author2" <"ht_mail2">" +#define ht_copyright2 "(c) 1999-2010 "ht_author2" <"ht_mail2">" #endif /* !__HTINFO_H__ */ From d5722116f1abc16c89eb6f01d3cebfc0883b8bf4 Mon Sep 17 00:00:00 2001 From: seppel Date: Thu, 7 Jul 2011 16:20:15 +0000 Subject: [PATCH 16/53] . --- ChangeLog | 3 + asm/x86asm.cc | 6 +- asm/x86opc.cc | 228 +++++++++++++++++++++++++++++++++++++++++--------- asm/x86opc.h | 2 +- 4 files changed, 194 insertions(+), 45 deletions(-) diff --git a/ChangeLog b/ChangeLog index 75b610b..3edec59 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5,6 +5,9 @@ version 2.0.19: - [x86] fixed a lot of small bugs - fixed a crash with the "follow" function on invalid addresses in analyser + - [x86] AVX updates + - [x86] AVX2 + - [x86] BMI and TBM instructions version 2.0.18: - updated c++ demangler diff --git a/asm/x86asm.cc b/asm/x86asm.cc index 662e199..728361d 100644 --- a/asm/x86asm.cc +++ b/asm/x86asm.cc @@ -1889,13 +1889,13 @@ bool x86asm::opmem(x86asm_insn *asm_insn, x86_insn_op *op, const char *s) tok(&s, token, sizeof token, sep); - static const char *types[] = {"byte", "word", "dword", "pword", "qword", "oword", "ymmword", "single", "double", "extended"}; - static byte type_size[] = {1, 2, 4, 6, 8, 16, 32, 4, 8, 10}; + static const char *types[] = {"byte", "word", "dword", "pword", "qword", "oword", "xmmword", "ymmword", "single", "double", "extended"}; + static byte type_size[] = {1, 2, 4, 6, 8, 16, 16, 32, 4, 8, 10}; // typecast for (uint i=0; i < sizeof types / sizeof types[0]; i++) { if (strcmp(token, types[i]) == 0) { hsize = type_size[i]; - if (i >= 6) floatptr = true; + if (i >= 8) floatptr = true; break; } } diff --git a/asm/x86opc.cc b/asm/x86opc.cc index a8c4d5a..8c64779 100644 --- a/asm/x86opc.cc +++ b/asm/x86opc.cc @@ -3,7 +3,7 @@ * x86opc.cc * * Copyright (C) 1999-2002 Stefan Weyergraf - * Copyright (C) 2005-2010 Sebastian Biallas (sb@biallas.net) + * Copyright (C) 2005-2011 Sebastian Biallas (sb@biallas.net) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -157,7 +157,9 @@ x86opc_insn_op x86_op_type[] = { {TYPE_R, 0, 0, SIZE_R}, #define Rr64 Rr+1 {TYPE_R, 0, INFO_DEFAULT_64, SIZE_R}, -#define RVw Rr64+1 +#define Rv Rr64+1 +{TYPE_R, 0, 0, SIZE_V}, +#define RVw Rv+1 {TYPE_RV, 0, 0, SIZE_W}, #define RVd RVw+1 {TYPE_RV, 0, 0, SIZE_D}, @@ -185,7 +187,9 @@ x86opc_insn_op x86_op_type[] = { #define VIo VVo+1 {TYPE_VI, 0, 0, SIZE_O}, -#define Ww VIo+1 +#define Wb VIo+1 +{TYPE_W, 0, 0, SIZE_W}, +#define Ww Wb+1 {TYPE_W, 0, 0, SIZE_W}, #define Wd Ww+1 {TYPE_W, 0, 0, SIZE_D}, @@ -208,7 +212,11 @@ x86opc_insn_op x86_op_type[] = { {TYPE_YR, 0, 0, SIZE_Y}, #define Xy YRy+1 {TYPE_X, 0, 0, SIZE_Y}, -#define Xo Xy+1 +#define Xd Xy+1 +{TYPE_X, 0, 0, SIZE_D}, +#define Xq Xd+1 +{TYPE_X, 0, 0, SIZE_Q}, +#define Xo Xq+1 {TYPE_X, 0, 0, SIZE_O}, #define VD Xo+1 @@ -417,10 +425,11 @@ const char *x86_segs[8] = { #define GROUP_EXT_72 20 #define GROUP_EXT_73 21 #define GROUP_EXT_AE 22 -#define GROUP_EXT_BA 23 -#define GROUP_EXT_C7 24 -#define GROUP_EXT_66_C7 25 -#define GROUP_EXT_F3_C7 26 +#define GROUP_EXT_F3_AE 23 +#define GROUP_EXT_BA 24 +#define GROUP_EXT_C7 25 +#define GROUP_EXT_66_C7 26 +#define GROUP_EXT_F3_C7 27 #define GROUP_SPECIAL_0F01_0 0 #define GROUP_SPECIAL_0F01_1 1 @@ -435,17 +444,20 @@ const char *x86_segs[8] = { #define GROUP_SPECIAL_0FAE_5 10 #define GROUP_SPECIAL_0FAE_6 11 #define GROUP_SPECIAL_0FAE_7 12 +#define GROUP_SPECIAL_0FC7_6 13 #define GROUP_0FAE 0 #define GROUP_660F71 1 #define GROUP_660F72 2 #define GROUP_660F73 3 -#define GROUP_0F25 4 -#define GROUP_0F25_L 5 -#define GROUP_0F25_W 6 -#define GROUP_0FA 7 -#define GROUP_0FA_L 8 -#define GROUP_0FA_W 9 +#define GROUP_0F25_12 4 +#define GROUP_0F25_12_L 5 +#define GROUP_0F25_12_W 6 +#define GROUP_0FA_12 7 +#define GROUP_0FA_12_L 8 +#define GROUP_0FA_12_W 9 +#define GROUP_0F38_F3 10 +#define GROUP_0F38_F3_W 11 /* @@ -1614,7 +1626,14 @@ x86opc_insn x86_insns_ext_f3[256] = { /* a0 */ {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, /* a8 */ -{0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, +{0}, +{0}, +{0}, +{0}, +{0}, +{0}, +{0, {SPECIAL_TYPE_GROUP, GROUP_EXT_F3_AE}}, +{0}, /* b0 */ {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, /* b8 */ @@ -1622,7 +1641,7 @@ x86opc_insn x86_insns_ext_f3[256] = { {0}, {0}, {0}, -{0}, +{"tzcnt", {Gv, Ev}}, {"lzcnt", {Gv, Ev}}, {0}, {0}, @@ -1856,7 +1875,8 @@ x86opc_insn x86_opc_group_insns[X86_OPC_GROUPS][256] = { /* 80 */ {"invept", {Gr, Mo}}, {"invvpid", {Gr, Mo}}, -{0}, {0}, {0}, {0}, {0}, {0}, +{"invpcid", {Gr, Mo}}, +{0}, {0}, {0}, {0}, {0}, /* 88 */ {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, /* 90 */ @@ -2847,6 +2867,17 @@ x86opc_insn x86_group_insns[][8] = { {0, {SPECIAL_TYPE_SGROUP, GROUP_SPECIAL_0FAE_6}}, {0, {SPECIAL_TYPE_SGROUP, GROUP_SPECIAL_0FAE_7}}, }, +/* 22 - GROUP_EXT_F3_AE */ +{ +{"rdfsbase", {Rr}}, +{"rdgsbase", {Rr}}, +{"wrfsbase", {Rr}}, +{"wrgsbase", {Rr}}, +{0}, +{0}, +{0}, +{0}, +}, /* 23 - GROUP_EXT_BA */ { {0}, @@ -2866,7 +2897,7 @@ x86opc_insn x86_group_insns[][8] = { {0}, {0}, {0}, -{"vmptrld", {Mq}}, +{0, {SPECIAL_TYPE_SGROUP, GROUP_SPECIAL_0FC7_6}}, {"vmptrst", {Mq}}, }, /* 25 - GROUP_EXT_66_C7 */ @@ -2970,7 +3001,7 @@ x86opc_insn x86_special_group_insns[X86_SPECIAL_GROUPS][9] = { {0}, {0}, // with mod!=11: -{"fxsave", {M}}, +{"?fxsave|fxsave|fxsave64", {M}}, }, /* 6 - GROUP_SPECIAL_0FAE_1 */ { @@ -2983,7 +3014,7 @@ x86opc_insn x86_special_group_insns[X86_SPECIAL_GROUPS][9] = { {0}, {0}, // with mod!=11: -{"fxstor", {M}}, +{"?fxstor|fxstor|fxstor64", {M}}, }, /* 7 - GROUP_SPECIAL_0FAE_2 */ { @@ -3022,7 +3053,7 @@ x86opc_insn x86_special_group_insns[X86_SPECIAL_GROUPS][9] = { {0}, {0}, // with mod!=11: -{"xsave", {M}}, +{"?xsave|xsave|xsave64", {M}}, }, /* 10 - GROUP_SPECIAL_0FAE_5 */ { @@ -3035,7 +3066,7 @@ x86opc_insn x86_special_group_insns[X86_SPECIAL_GROUPS][9] = { {0}, {0}, // with mod!=11: -{"xrstor", {M}}, +{"?xrstor|xrstor|xrstor64", {M}}, }, /* 11 - GROUP_SPECIAL_0FAE_6 */ { @@ -3046,7 +3077,7 @@ x86opc_insn x86_special_group_insns[X86_SPECIAL_GROUPS][9] = { {0}, {0}, {0}, -{0}, +{"?xsaveopt|xsaveopt|xsaveopt64", {M}}, // with mod!=11: {0}, }, @@ -3063,6 +3094,19 @@ x86opc_insn x86_special_group_insns[X86_SPECIAL_GROUPS][9] = { // with mod!=11: {"clflush", {M}}, }, +/* 12 - GROUP_SPECIAL_0FC7_6 */ +{ +{"rdrand", {Rv}}, +{"rdrand", {Rv}}, +{"rdrand", {Rv}}, +{"rdrand", {Rv}}, +{"rdrand", {Rv}}, +{"rdrand", {Rv}}, +{"rdrand", {Rv}}, +{"rdrand", {Rv}}, +// with mod!=11: +{"vmptrld", {Mq}}, +}, }; /* @@ -3366,10 +3410,13 @@ x86opc_finsn x86_float_group_insns[8][8] = { #define Elast {0}}; E0(00) {"vpshufb", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vpermq", _256|_66|_0f3a|W1, {Yy, Xy, Ib}}, E(01) {"vhaddw", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vpermpd", _256|_66|_0f3a|W1, {Yy, Xy, Ib}}, E(02) {"vhaddd", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vpblendd", _128|_66|_0f3a|W0, {Vo, VVo, Wo, Ib}}, E(03) {"vhaddsw", _128|_66|_0f38, {Vo, VVo, Wo}}, E(04) @@ -3436,12 +3483,12 @@ E(11) {"vmovupd", _128|_66|_0f, {Wo, Vo}}, {"vmovupd", _256|_66|_0f, {Xy, Yy}}, E(12) -{0, _128|_0f25|W0, {SPECIAL_TYPE_GROUP, GROUP_0F25}}, -{0, _128|_0f25|W1, {SPECIAL_TYPE_GROUP, GROUP_0F25_W}}, -{0, _256|_0f25|W0, {SPECIAL_TYPE_GROUP, GROUP_0F25_L}}, -{0, _128|_0fA|W0, {SPECIAL_TYPE_GROUP, GROUP_0FA}}, -{0, _128|_0fA|W1, {SPECIAL_TYPE_GROUP, GROUP_0FA_W}}, -{0, _256|_0fA|W0, {SPECIAL_TYPE_GROUP, GROUP_0FA_L}}, +{0, _128|_0f25|W0, {SPECIAL_TYPE_GROUP, GROUP_0F25_12}}, +{0, _128|_0f25|W1, {SPECIAL_TYPE_GROUP, GROUP_0F25_12_W}}, +{0, _256|_0f25|W0, {SPECIAL_TYPE_GROUP, GROUP_0F25_12_L}}, +{0, _128|_0fA|W0, {SPECIAL_TYPE_GROUP, GROUP_0FA_12}}, +{0, _128|_0fA|W1, {SPECIAL_TYPE_GROUP, GROUP_0FA_12_W}}, +{0, _256|_0fA|W0, {SPECIAL_TYPE_GROUP, GROUP_0FA_12_L}}, {"vmovddup", _128|_f2|_0f, {Vo, Wq}}, {"vmovddup", _256|_f2|_0f, {Yy, Xy}}, {"vmovhlps", _128|_0f, {Vo, VVo, VRo}}, @@ -3452,6 +3499,8 @@ E(12) E(13) {"vmovlps", _128|_0f, {Mq, Vo}}, {"vmovlpd", _128|_66|_0f, {Mq, Vo}}, +{"vcvtph2ps", _128|_0f, {Vo, Wq}}, +{"vcvtph2ps", _256|_66|_0f38, {Yy, Wo}}, E(14) {"vpextrb", _128|_66|_0f3a, {MRbr, Vo, Ib}}, {"vunpcklps", _128|_0f, {Vo, VVo, Wo}}, @@ -3472,6 +3521,7 @@ E(16) {"vmovlhps", _128|_0f, {Vo, VVo, VRo}}, {"vmovshdup", _128|_f3|_0f, {Vo, Wo}}, {"vmovshdup", _256|_f3|_0f, {Yy, Xy}}, +{"vpermps", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, E(17) {"vmovhps", _128|_0f, {Mq, Vo}}, {"vmovhpd", _128|_66|_0f, {Mq, Vo}}, @@ -3480,11 +3530,11 @@ E(17) {"vptest", _128|_66|_0f38, {Vo, Wo}}, {"vptest", _256|_66|_0f38, {Yy, Xy}}, E(18) -{"vbroadcastss", _128|_66|_0f38, {Vo, Md}}, -{"vbroadcastss", _256|_66|_0f38, {Yy, Md}}, +{"vbroadcastss", _128|_66|_0f38, {Vo, Xd}}, +{"vbroadcastss", _256|_66|_0f38, {Yy, Xd}}, {"vinsertf128", _256|_66|_0f3a, {Yy, YVy, Xy, Ib}}, E(19) -{"vbroadcastsd", _256|_66|_0f38, {Yy, Mq}}, +{"vbroadcastsd", _256|_66|_0f38, {Yy, Xq}}, {"vextractf128", _256|_66|_0f3a, {Xy, Yy, Ib}}, E(1a) {"vbroadcastf128", _256|_66|_0f38, {Yy, My}}, @@ -3492,6 +3542,8 @@ E(1c) {"vpabsb", _128|_66|_0f38, {Vo, Wo}}, E(1d) {"vpabsw", _128|_66|_0f38, {Vo, Wo}}, +{"vcvtps2ph", _128|_66|_0f3a, {Wq, Vo, Ib}}, +{"vcvtps2ph", _256|_66|_0f3a, {Wo, Yy, Ib}}, E(1e) {"vpabsd", _128|_66|_0f38, {Vo, Wo}}, E(20) @@ -3520,6 +3572,7 @@ E(29) {"vpcmpeqq", _128|_66|_0f38, {Vo, VVo, Wo}}, E(2a) {"vmovntdqa", _128|_66|_0f38, {Vo, Mo}}, +{"vmovntdqa", _256|_66|_0f38, {Yy, My}}, {"vcvtsi2ss", _128|_f3|_0f|W0, {Vo, VVo, Ed}}, {"vcvtsi2ss", _128|_f3|_0f|W1, {Vo, VVo, Eq}}, {"vcvtsi2sd", _128|_f2|_0f|W0, {Vo, VVo, Ed}}, @@ -3566,12 +3619,16 @@ E(34) {"vpmovzxwq", _128|_66|_0f38, {Vo, Wd}}, E(35) {"vpmovzxdq", _128|_66|_0f38, {Vo, Wq}}, +E(36) +{"vpermd", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, E(37) {"vpcmpgtq", _128|_66|_0f38, {Vo, VVo, Wo}}, E(38) {"vpminsb", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vinserti128", _256|_66|_0f3a, {Yy, YVy, Wo, Ib}}, E(39) {"vpminsd", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vextracti128", _256|_66|_0f3a, {Wo, Yy, Ib}}, E(3a) {"vpminuw", _128|_66|_0f38, {Vo, VVo, Wo}}, E(3b) @@ -3595,6 +3652,20 @@ E(42) {"vmpsadbw", _128|_66|_0f3a, {Vo, VVo, Wo, Ib}}, E(44) {"vpclmulqdq", _128|_66|_0f3a, {Vo, VVo, Wo, Ib}}, +E(45) +{"vpsrlvd", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vpsrlvd", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, +{"vpsrlvq", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +{"vpsrlvq", _256|_66|_0f38|W1, {Yy, YVy, Xy}}, +E(46) +{"vpsravd", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vpsravd", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, +{"vpermi128", _256|_66|_0f3a|W0, {Yy, YVy, Xy, Ib}}, +E(47) +{"vpsllvd", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vpsllvd", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, +{"vpsllvq", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +{"vpsllvq", _256|_66|_0f38|W1, {Yy, YVy, Xy}}, E(48) {"vpermil2ps", _128|_66|_0f3a|W0, {Vo, VVo, Wo, VIo, I4}}, {"vpermil2ps", _128|_66|_0f3a|W1, {Vo, VVo, VIo, Wo, I4}}, @@ -3658,6 +3729,8 @@ E(58) {"vaddpd", _256|_66|_0f, {Yy, YVy, Xy}}, {"vaddss", _128|_f2|_0f, {Vo, VVo, Wo}}, {"vaddsd", _128|_f3|_0f, {Vo, VVo, Wo}}, +{"vpbroadcastd", _128|_66|_0f38|W0, {Vo, Wd}}, +{"vpbroadcastd", _256|_66|_0f38|W0, {Yy, Wd}}, E(59) {"vmulss", _128|_0f, {Vo, VVo, Wo}}, {"vmulps", _256|_0f, {Yy, YVy, Xy}}, @@ -3665,6 +3738,8 @@ E(59) {"vmulpd", _256|_66|_0f, {Yy, YVy, Xy}}, {"vmulss", _128|_f2|_0f, {Vo, VVo, Wo}}, {"vmulsd", _128|_f3|_0f, {Vo, VVo, Wo}}, +{"vpbroadcastq", _128|_66|_0f38|W0, {Vo, Wq}}, +{"vpbroadcastq", _256|_66|_0f38|W0, {Yy, Wq}}, E(5a) {"vcvtps2pd", _128|_0f, {Vo, Wo}}, {"vcvtps2pd", _256|_0f, {Yy, Xy}}, @@ -3672,6 +3747,7 @@ E(5a) {"vcvtpd2ps", _256|_66|_0f, {Yy, Xy}}, {"vcvtss2sd", _128|_f3|_0f, {Vo, VVo, Wd}}, {"vcvtsd2ss", _128|_f2|_0f, {Vo, VVo, Wq}}, +{"vbroadcasti128", _256|_66|_0f38, {Yy, My}}, E(5b) {"vcvtdq2ps", _128|_0f, {Vo, Wo}}, {"vcvtdq2ps", _256|_0f, {Yy, Xy}}, @@ -3807,11 +3883,15 @@ E(77) {"vzeroupper", _128|_0f}, {"vzeroall", _256|_0f}, E(78) +{"vpbroadcastb", _128|_66|_0f38|W0, {Vo, Wb}}, +{"vpbroadcastb", _256|_66|_0f38|W0, {Yy, Wb}}, {"vfnmaddps", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, {"vfnmaddps", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, {"vfnmaddps", _256|_66|_0f3a|W0, {Yy, YIy, YVy, Xy}}, {"vfnmaddps", _256|_66|_0f3a|W1, {Yy, YIy, Xy, YVy}}, E(79) +{"vpbroadcastw", _128|_66|_0f38|W0, {Vo, Ww}}, +{"vpbroadcastw", _256|_66|_0f38|W0, {Yy, Ww}}, {"vfnmaddpd", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, {"vfnmaddpd", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, {"vfnmaddpd", _256|_66|_0f3a|W0, {Yy, YIy, YVy, Xy}}, @@ -3871,22 +3951,43 @@ E(86) {"vpmacsswd", _128|_0f24, {Vo, VVo, Wo, VIo}}, E(87) {"vpmacssdql", _128|_0f24, {Vo, VVo, Wo, VIo}}, +E(8c) +{"vpmaskmovd", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, +{"vpmaskmovd", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, +{"vpmaskmovq", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, +{"vpmaskmovq", _256|_66|_0f38|W1, {Yy, YVy, Xy}}, E(8e) {"vpmacssdd", _128|_0f24, {Vo, VVo, Wo, VIo}}, +{"vpmaskmovd", _128|_66|_0f38|W0, {Wo, VVo, Vo}}, +{"vpmaskmovd", _256|_66|_0f38|W0, {Xy, YVy, Yy}}, +{"vpmaskmovq", _128|_66|_0f38|W1, {Wo, VVo, Vo}}, +{"vpmaskmovq", _256|_66|_0f38|W1, {Xy, YVy, Yy}}, E(8f) {"vpmacssdqh", _128|_0f24, {Vo, VVo, Wo, VIo}}, E(90) {"vprotb", _128|_0f25|W0, {Vo, Wo, VVo}}, {"vprotb", _128|_0f25|W1, {Vo, VVo, Wo}}, +{"vpgatherdd", _128|_66|_0f38|W0, {Vo, Wo, VVo}}, +{"vpgatherdd", _256|_66|_0f38|W0, {Yy, Xy, YVy}}, +{"vpgatherdq", _128|_66|_0f38|W1, {Vo, Wo, VVo}}, +{"vpgatherdq", _256|_66|_0f38|W1, {Yy, Xy, YVy}}, E(91) {"vprotw", _128|_0f25|W0, {Vo, Wo, VVo}}, {"vprotw", _128|_0f25|W1, {Vo, VVo, Wo}}, +{"vpgatherqd", _128|_66|_0f38|W0, {Vo, Wo, VVo}}, +{"vpgatherqd", _256|_66|_0f38|W0, {Yy, Xy, YVy}}, +{"vpgatherqq", _128|_66|_0f38|W1, {Vo, Wo, VVo}}, +{"vpgatherqq", _256|_66|_0f38|W1, {Yy, Xy, YVy}}, E(92) {"vprotd", _128|_0f25|W0, {Vo, Wo, VVo}}, {"vprotd", _128|_0f25|W1, {Vo, VVo, Wo}}, +{"vgatherdps", _128|_66|_0f38|W0, {Vo, Wo, VVo}}, +{"vgatherdps", _256|_66|_0f38|W0, {Yy, Xy, YVy}}, E(93) {"vprotq", _128|_0f25|W0, {Vo, Wo, VVo}}, {"vprotq", _128|_0f25|W1, {Vo, VVo, Wo}}, +{"vgatherqps", _128|_66|_0f38|W0, {Vo, Wo, VVo}}, +{"vgatherqps", _256|_66|_0f38|W0, {Yy, Xy, YVy}}, E(94) {"vpshlb", _128|_0f25|W0, {Vo, Wo, VVo}}, {"vpshlb", _128|_0f25|W1, {Vo, VVo, Wo}}, @@ -4178,24 +4279,47 @@ E(ee) {"vpcomud", _128|_0f24, {Vo, VVo, Wo, Ib}}, E(ef) {"vpxor", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpxor", _256|_66|_0f, {Yy, YVy, Xy}}, {"vpcomuq", _128|_0f24, {Vo, VVo, Wo, Ib}}, E(f0) {"vlddqu", _128|_f2|_0f, {Vo, Mo}}, {"vlddqu", _256|_f2|_0f, {Yy, My}}, +{"rorx", _128|_f2|_0f3a|W0, {Gd, Ed, Ib}}, +{"rorx", _128|_f2|_0f3a|W1, {Gq, Eq, Ib}}, E(f1) {"vpsllw", _128|_66|_0f, {Vo, VVo, Wo}}, E(f2) {"vpslld", _128|_66|_0f, {Vo, VVo, Wo}}, +{"andn", _128|_0f38|W0, {Gd, RVd, Ed}}, +{"andn", _128|_0f38|W1, {Gq, RVq, Eq}}, E(f3) +{0, _128|_0f38|W0, {SPECIAL_TYPE_GROUP, GROUP_0F38_F3}}, +{0, _128|_0f38|W1, {SPECIAL_TYPE_GROUP, GROUP_0F38_F3_W}}, {"vpsllq", _128|_66|_0f, {Vo, VVo, Wo}}, E(f4) {"vmuludq", _128|_66|_0f, {Vo, VVo, Wo}}, E(f5) {"vmaddwd", _128|_66|_0f, {Vo, VVo, Wo}}, +{"bzhi", _128|_0f38|W0, {Gd, RVd, Ed}}, +{"bzhi", _128|_0f38|W1, {Gq, RVq, Eq}}, +{"pdep", _128|_f2|_0f38|W0, {Gd, RVd, Ed}}, +{"pdep", _128|_f2|_0f38|W1, {Gq, RVq, Eq}}, +{"pdep", _128|_f3|_0f38|W0, {Gd, RVd, Ed}}, +{"pdep", _128|_f3|_0f38|W1, {Gq, RVq, Eq}}, E(f6) {"vpsadbw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"mulx", _128|_f2|_0f38|W0, {Gd, RVd, Ed}}, +{"mulx", _128|_f2|_0f38|W1, {Gq, RVq, Eq}}, E(f7) {"vmaskmovdqu", _128|_66|_0f, {Vo, VRo}}, +{"bextr", _128|_0f38|W0, {Gd, RVd, Ed}}, +{"bextr", _128|_0f38|W1, {Gq, RVq, Eq}}, +{"sarx", _128|_f3|_0f38|W0, {Gd, RVd, Ed}}, +{"sarx", _128|_f3|_0f38|W1, {Gq, RVq, Eq}}, +{"shlx", _128|_66|_0f38|W0, {Gd, RVd, Ed}}, +{"shlx", _128|_66|_0f38|W1, {Gq, RVq, Eq}}, +{"shlx", _128|_f2|_0f38|W0, {Gd, RVd, Ed}}, +{"shlx", _128|_f2|_0f38|W1, {Gq, RVq, Eq}}, E(f8) {"vpsubb", _128|_66|_0f, {Vo, VVo, Wo}}, E(f9) @@ -4257,7 +4381,7 @@ x86opc_vex_insn x86_group_vex_insns[][8] = { {"vpsllq", _128|_66|_0f, {VVo, VRo, Ib}}, {"vpslldq", _128|_66|_0f, {VVo, VRo, Ib}}, }, -/* 4 - GROUP_0F2512 */ +/* 4 - GROUP_0F25_12 */ { {"llwpcb", _128|_0f25|W0, {Rw}}, {"slwpcb", _128|_0f25|W0, {Rw}}, @@ -4268,7 +4392,7 @@ x86opc_vex_insn x86_group_vex_insns[][8] = { {0}, {0}, }, -/* 5 - GROUP_0F2512_L */ +/* 5 - GROUP_0F25_12_L */ { {"llwpcb", _256|_0f25|W0, {Rd}}, {"slwpcb", _256|_0f25|W0, {Rd}}, @@ -4279,7 +4403,7 @@ x86opc_vex_insn x86_group_vex_insns[][8] = { {0}, {0}, }, -/* 6 - GROUP_0F2512_W */ +/* 6 - GROUP_0F25_12_W */ { {"llwpcb", _128|_0f25|W1, {Rq}}, {"slwpcb", _128|_0f25|W1, {Rq}}, @@ -4290,7 +4414,7 @@ x86opc_vex_insn x86_group_vex_insns[][8] = { {0}, {0}, }, -/* 7 - GROUP_0FA */ +/* 7 - GROUP_0FA_12 */ { {"lwpins", _128|_0fA, {RVw, Ed, Iw}}, {"lwpval", _128|_0fA, {RVw, Ed, Iw}}, @@ -4301,7 +4425,7 @@ x86opc_vex_insn x86_group_vex_insns[][8] = { {0}, {0}, }, -/* 8 - GROUP_0FA_L */ +/* 8 - GROUP_0FA_12_L */ { {"lwpins", _256|_0fA, {RVd, Ed, Id}}, {"lwpval", _256|_0fA, {RVd, Ed, Id}}, @@ -4312,7 +4436,7 @@ x86opc_vex_insn x86_group_vex_insns[][8] = { {0}, {0}, }, -/* 9 - GROUP_0FA_W */ +/* 9 - GROUP_0FA_12_W */ { {"lwpins", _128|_0fA|W1, {RVq, Ed, Id}}, {"lwpval", _128|_0fA|W1, {RVq, Ed, Id}}, @@ -4323,6 +4447,28 @@ x86opc_vex_insn x86_group_vex_insns[][8] = { {0}, {0}, }, +/* 12 - GROUP_0F38_F3 */ +{ +{0}, +{"blsr", _128|_0f38|W0, {RVd, Ed}}, +{"blsmsk", _128|_0f38|W0, {RVd, Ed}}, +{"blsi", _128|_0f38|W0, {RVd, Ed}}, +{0}, +{0}, +{0}, +{0}, +}, +/* 11 - GROUP_0F38_F3_W */ +{ +{0}, +{"blsr", _128|_0f38|W1, {RVq, Eq}}, +{"blsmsk", _128|_0f38|W1, {RVq, Eq}}, +{"blsi", _128|_0f38|W1, {RVq, Eq}}, +{0}, +{0}, +{0}, +{0}, +}, }; x86opc_vex_insn *x86_vex_insns[256] = { @@ -4332,9 +4478,9 @@ v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v1a, 0, v1c, v1d, v1e, 0, v20, v21, v22, v23, v24, v25, 0, 0, v28, v29, v2a, v2b, v2c, v2d, v2e, v2f, -v30, v31, v32, v33, v34, v35, 0, v37, +v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v3a, v3b, v3c, v3d, v3e, v3f, -v40, v41, v42, 0, v44, 0, 0, 0, +v40, v41, v42, 0, v44, v45, v46, v47, v48, v49, v4a, v4b, v4c, 0, 0, 0, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v5a, v5b, v5c, v5d, v5e, v5f, @@ -4343,7 +4489,7 @@ v68, v69, v6a, v6b, v6c, v6d, v6e, v6f, v70, v71, v72, v73, v74, v75, v76, v77, v78, v79, v7a, v7b, v7c, v7d, v7e, v7f, v80, v81, v82, v83, 0, v85, v86, v87, - 0, 0, 0, 0, 0, 0, v8e, v8f, + 0, 0, 0, 0, v8c, 0, v8e, v8f, v90, v91, v92, v93, v94, v95, v96, v97, v98, v99, v9a, v9b, v9c, v9d, v9e, v9f, va0, va1, va2, va3, 0, 0, va6, va7, diff --git a/asm/x86opc.h b/asm/x86opc.h index 2d17cc7..86b0fd2 100644 --- a/asm/x86opc.h +++ b/asm/x86opc.h @@ -260,7 +260,7 @@ struct x86opc_finsn { #define X86_REG_IP 66 #define X86_OPC_GROUPS 9 -#define X86_SPECIAL_GROUPS 13 +#define X86_SPECIAL_GROUPS 14 extern x86opc_insn x86_les; extern x86opc_insn x86_lds; From 102f636a977147b2eb836e04c9a06c34f57437a7 Mon Sep 17 00:00:00 2001 From: seppel Date: Sat, 20 Aug 2011 12:54:51 +0000 Subject: [PATCH 17/53] *** empty log message *** --- ChangeLog | 3 ++- autogen.sh | 11 +++++++++++ htelf.cc | 50 ++++++++++++++++++++++++++------------------------ htelfimg.cc | 4 ++-- htelfshs.cc | 17 ++++++++++++++--- 5 files changed, 55 insertions(+), 30 deletions(-) create mode 100755 autogen.sh diff --git a/ChangeLog b/ChangeLog index 3edec59..be095ce 100644 --- a/ChangeLog +++ b/ChangeLog @@ -7,7 +7,8 @@ version 2.0.19: invalid addresses in analyser - [x86] AVX updates - [x86] AVX2 - - [x86] BMI and TBM instructions + - [x86] BMI, BMI2 and TBM instructions + - fixed loading of ELF files with no section headers version 2.0.18: - updated c++ demangler diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..4165412 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# script to prepare HT sources +aclocal -I . \ +&& autoheader \ +&& automake --add-missing \ +&& autoconf \ +|| exit 1 + +echo HT sources are now prepared. To build here, run: +echo " ./configure" +echo " make ; make htdoc.h ; make" diff --git a/htelf.cc b/htelf.cc index 19500f2..a548344 100644 --- a/htelf.cc +++ b/htelf.cc @@ -66,7 +66,7 @@ static ht_view *htelf_init(Bounds *b, File *file, ht_format_group *format_group) break; default: LOG_EX(LOG_WARN, "File seems to be ELF. But byte-order" - " (ELF_EI_DATA) 0x%02x is unsupported. (byte at offset=0x%x)", + " (ELF_EI_DATA) 0x%02x is unsupported. (byte at offset=0x%qx)", header.e_ident[ELF_EI_DATA], header_ofs+5); return NULL; } @@ -76,7 +76,7 @@ static ht_view *htelf_init(Bounds *b, File *file, ht_format_group *format_group) break; default: LOG_EX(LOG_WARN, "File seems to be ELF. But class-value" - " (ELF_EI_CLASS) 0x%02x is unsupported. (byte at offset=0x%x)", + " (ELF_EI_CLASS) 0x%02x is unsupported. (byte at offset=0x%qx)", header.e_ident[ELF_EI_CLASS], header_ofs+4); return NULL; } @@ -152,13 +152,15 @@ void ht_elf::init(Bounds *b, File *f, format_viewer_if **ifs, ht_format_group *f /* read section headers */ elf_shared->sheaders.count = elf_shared->header32.e_shnum; - if (!elf_shared->sheaders.count) throw MsgException("Zero count for section headers"); - elf_shared->sheaders.sheaders32 = ht_malloc(elf_shared->sheaders.count*sizeof *elf_shared->sheaders.sheaders32); - file->seek(header_ofs+elf_shared->header32.e_shoff); - file->readx(elf_shared->sheaders.sheaders32, elf_shared->sheaders.count*sizeof *elf_shared->sheaders.sheaders32); - for (uint i=0; i < elf_shared->sheaders.count; i++) { - ELF_SECTION_HEADER32 a = elf_shared->sheaders.sheaders32[i]; - createHostStruct(elf_shared->sheaders.sheaders32+i, ELF_SECTION_HEADER32_struct, elf_shared->byte_order); + if (!elf_shared->sheaders.count) { + elf_shared->sheaders.sheaders32 = NULL; + } else { + file->seek(header_ofs + elf_shared->header32.e_shoff); + file->readx(elf_shared->sheaders.sheaders32, elf_shared->sheaders.count*sizeof *elf_shared->sheaders.sheaders32); + for (uint i=0; i < elf_shared->sheaders.count; i++) { + ELF_SECTION_HEADER32 a = elf_shared->sheaders.sheaders32[i]; + createHostStruct(elf_shared->sheaders.sheaders32+i, ELF_SECTION_HEADER32_struct, elf_shared->byte_order); + } } /* read program headers */ @@ -170,7 +172,7 @@ void ht_elf::init(Bounds *b, File *f, format_viewer_if **ifs, ht_format_group *f elf_shared->pheaders.pheaders32 = ht_malloc(elf_shared->pheaders.count*sizeof *elf_shared->pheaders.pheaders32); file->seek(header_ofs + elf_shared->header32.e_phoff); file->readx(elf_shared->pheaders.pheaders32, elf_shared->pheaders.count*sizeof *elf_shared->pheaders.pheaders32); - for (uint i=0; ipheaders.count; i++) { + for (uint i=0; i < elf_shared->pheaders.count; i++) { createHostStruct(elf_shared->pheaders.pheaders32+i, ELF_PROGRAM_HEADER32_struct, elf_shared->byte_order); } // if file is relocatable, relocate it @@ -200,9 +202,9 @@ void ht_elf::init(Bounds *b, File *f, format_viewer_if **ifs, ht_format_group *f elf_shared->sheaders.count=elf_shared->header64.e_shnum; if (!elf_shared->sheaders.count) throw MsgException("Zero count for section headers"); elf_shared->sheaders.sheaders64 = ht_malloc(elf_shared->sheaders.count*sizeof *elf_shared->sheaders.sheaders64); - file->seek(header_ofs+elf_shared->header64.e_shoff); + file->seek(header_ofs + elf_shared->header64.e_shoff); file->readx(elf_shared->sheaders.sheaders64, elf_shared->sheaders.count*sizeof *elf_shared->sheaders.sheaders64); - for (uint i=0; isheaders.count; i++) { + for (uint i=0; i < elf_shared->sheaders.count; i++) { ELF_SECTION_HEADER64 a = elf_shared->sheaders.sheaders64[i]; createHostStruct(elf_shared->sheaders.sheaders64+i, ELF_SECTION_HEADER64_struct, elf_shared->byte_order); } @@ -283,11 +285,11 @@ static elf32_addr elf32_invent_address(uint si, ELF_SECTION_HEADER32 *s, uint sc { elf32_addr a = base; assert(s[si].sh_addr == 0); - while (a= s[i].sh_addr) - && (a < s[i].sh_addr+s[i].sh_size)) { + for (uint i=0; i < scount; i++) { + if (a >= s[i].sh_addr + && a < s[i].sh_addr+s[i].sh_size) { ok = false; break; } @@ -311,7 +313,7 @@ void ht_elf::relocate_section(ht_reloc_file *f, uint si, uint rsi, elf32_addr a) FileOfs symh = elf_shared->sheaders.sheaders32[symtabidx].sh_offset; if (s[rsi].sh_type != ELF_SHT_REL) throw MsgfException( - "invalid section type for section %d (expeecting %d)", + "invalid section type for section %d (expecting %d)", rsi, ELF_SHT_REL); uint relnum = s[rsi].sh_size / sizeof (ELF_REL32); @@ -446,7 +448,7 @@ void ht_elf::auto_relocate32() try { relocate_section(rf, i, elf_shared->shrelocs[i].relocShIdx, elf_shared->shrelocs[i].relocAddr); } catch (const Exception &x) { - LOG("error while relocating section %d: %s", i, &x); + LOG("error while relocating section %d: %y", i, &x); } } } @@ -684,12 +686,12 @@ ht_elf32_reloc_entry::ht_elf32_reloc_entry(uint t, uint32 A, uint32 P, uint32 S) { type = t; switch (type) { - case ELF_R_386_32: - relocs.r_32 = S+A; - break; - case ELF_R_386_PC32: - relocs.r_pc32 = S+A-P; - break; + case ELF_R_386_32: + relocs.r_32 = S+A; + break; + case ELF_R_386_PC32: + relocs.r_pc32 = S+A-P; + break; } } diff --git a/htelfimg.cc b/htelfimg.cc index 64673cc..aa38b6a 100644 --- a/htelfimg.cc +++ b/htelfimg.cc @@ -65,7 +65,7 @@ static ht_view *htelfimage_init(Bounds *b, File *file, ht_format_group *group) l.a32 = (uint32)-1; h.a32 = 0; ELF_SECTION_HEADER32 *s = elf_shared->sheaders.sheaders32; - for (uint i=0; isheaders.count; i++) { + for (uint i=0; i < elf_shared->sheaders.count; i++) { if (elf_valid_section((elf_section_header*)s, elf_shared->ident.e_ident[ELF_EI_CLASS])) { if (s->sh_addr < l.a32) l.a32=s->sh_addr; if ((s->sh_addr + s->sh_size > h.a32) && s->sh_size) h.a32=s->sh_addr + s->sh_size - 1; @@ -81,7 +81,7 @@ static ht_view *htelfimage_init(Bounds *b, File *file, ht_format_group *group) l.a64 = (uint64)-1; h.a64 = 0; ELF_SECTION_HEADER64 *s = elf_shared->sheaders.sheaders64; - for (uint i=0; isheaders.count; i++) { + for (uint i=0; i < elf_shared->sheaders.count; i++) { if (elf_valid_section((elf_section_header*)s, elf_shared->ident.e_ident[ELF_EI_CLASS])) { if (s->sh_addr < l.a64) l.a64 = s->sh_addr; if ((s->sh_addr + s->sh_size > h.a64) diff --git a/htelfshs.cc b/htelfshs.cc index e296ea5..9c3954f 100644 --- a/htelfshs.cc +++ b/htelfshs.cc @@ -95,6 +95,10 @@ static ht_view *htelfsectionheaders_init(Bounds *b, File *file, ht_format_group { ht_elf_shared_data *elf_shared=(ht_elf_shared_data *)group->get_shared_data(); + if (elf_shared->sheaders.count == 0) { + return NULL; + } + ht_uformat_viewer *v = NULL; bool elf_bigendian = elf_shared->ident.e_ident[ELF_EI_DATA]==ELFDATA2MSB; if (elf_shared->ident.e_ident[ELF_EI_CLASS] == ELFCLASS32) { @@ -117,14 +121,21 @@ static ht_view *htelfsectionheaders_init(Bounds *b, File *file, ht_format_group v->insertsub(m); elf_shared->shnames = ht_malloc(elf_shared->sheaders.count * sizeof *elf_shared->shnames); - FileOfs so = elf_shared->sheaders.sheaders32[elf_shared->header32.e_shstrndx].sh_offset; + FileOfs so; + if (elf_shared->header32.e_shstrndx < elf_shared->sheaders.count) { + so = elf_shared->sheaders.sheaders32[elf_shared->header32.e_shstrndx].sh_offset; + } else { + so = -1; + } String s; for (uint i=0; i < elf_shared->sheaders.count; i++) { s = "?"; try { - file->seek(so + elf_shared->sheaders.sheaders32[i].sh_name); - file->readStringz(s); + if (so != -1) { + file->seek(so + elf_shared->sheaders.sheaders32[i].sh_name); + file->readStringz(s); + } } catch (const Exception &x) { // and now? } From 0fc28e091688b82ed60f01730aa11dda56db7a4c Mon Sep 17 00:00:00 2001 From: seppel Date: Sun, 6 Nov 2011 20:49:26 +0000 Subject: [PATCH 18/53] *** empty log message *** --- cp-demangle.c | 513 ++++++++++++++++++++++++++++++++++++++++---------- cp-demangle.h | 5 +- cplus-dem.c | 111 +---------- demangle.h | 29 ++- 4 files changed, 448 insertions(+), 210 deletions(-) diff --git a/cp-demangle.c b/cp-demangle.c index 0042b21..7e951cc 100644 --- a/cp-demangle.c +++ b/cp-demangle.c @@ -1,5 +1,5 @@ /* Demangler for g++ V3 ABI. - Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 + Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. Written by Ian Lance Taylor . @@ -124,6 +124,8 @@ extern char *alloca (); # endif /* alloca */ #endif /* HAVE_ALLOCA_H */ +#include "ansidecl.h" +#include "libiberty.h" #include "demangle.h" #include "cp-demangle.h" @@ -300,6 +302,8 @@ struct d_print_info /* The current index into any template argument packs we are using for printing. */ int pack_index; + /* Number of d_print_flush calls so far. */ + unsigned long int flush_count; }; #ifdef CP_DEMANGLE_DEBUG @@ -317,6 +321,9 @@ d_make_comp (struct d_info *, enum demangle_component_type, static struct demangle_component * d_make_name (struct d_info *, const char *, int); +static struct demangle_component * +d_make_demangle_mangled_name (struct d_info *, const char *); + static struct demangle_component * d_make_builtin_type (struct d_info *, const struct demangle_builtin_type_info *); @@ -387,6 +394,8 @@ d_class_enum_type (struct d_info *); static struct demangle_component *d_array_type (struct d_info *); +static struct demangle_component *d_vector_type (struct d_info *); + static struct demangle_component * d_pointer_to_member_type (struct d_info *); @@ -406,6 +415,10 @@ static struct demangle_component *d_local_name (struct d_info *); static int d_discriminator (struct d_info *); +static struct demangle_component *d_lambda (struct d_info *); + +static struct demangle_component *d_unnamed_type (struct d_info *); + static int d_add_substitution (struct d_info *, struct demangle_component *); @@ -790,6 +803,7 @@ d_make_comp (struct d_info *di, enum demangle_component_type type, case DEMANGLE_COMPONENT_LITERAL: case DEMANGLE_COMPONENT_LITERAL_NEG: case DEMANGLE_COMPONENT_COMPOUND_NAME: + case DEMANGLE_COMPONENT_VECTOR_TYPE: if (left == NULL || right == NULL) return NULL; break; @@ -817,6 +831,8 @@ d_make_comp (struct d_info *di, enum demangle_component_type type, case DEMANGLE_COMPONENT_JAVA_RESOURCE: case DEMANGLE_COMPONENT_DECLTYPE: case DEMANGLE_COMPONENT_PACK_EXPANSION: + case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS: + case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS: if (left == NULL) return NULL; break; @@ -856,6 +872,17 @@ d_make_comp (struct d_info *di, enum demangle_component_type type, return p; } +/* Add a new demangle mangled name component. */ + +static struct demangle_component * +d_make_demangle_mangled_name (struct d_info *di, const char *s) +{ + if (d_peek_char (di) != '_' || d_peek_next_char (di) != 'Z') + return d_make_name (di, s, strlen (s)); + d_advance (di, 2); + return d_encoding (di, 0); +} + /* Add a new name component. */ static struct demangle_component * @@ -918,6 +945,20 @@ d_make_extended_operator (struct d_info *di, int args, return p; } +static struct demangle_component * +d_make_default_arg (struct d_info *di, int num, + struct demangle_component *sub) +{ + struct demangle_component *p = d_make_empty (di); + if (p) + { + p->type = DEMANGLE_COMPONENT_DEFAULT_ARG; + p->u.s_unary_num.num = num; + p->u.s_unary_num.sub = sub; + } + return p; +} + /* Add a new constructor component. */ static struct demangle_component * @@ -1149,8 +1190,9 @@ d_name (struct d_info *di) return d_local_name (di); case 'L': + case 'U': return d_unqualified_name (di); - + case 'S': { int subst; @@ -1272,6 +1314,7 @@ d_prefix (struct d_info *di) || IS_LOWER (peek) || peek == 'C' || peek == 'D' + || peek == 'U' || peek == 'L') dc = d_unqualified_name (di); else if (peek == 'S') @@ -1287,6 +1330,16 @@ d_prefix (struct d_info *di) dc = d_template_param (di); else if (peek == 'E') return ret; + else if (peek == 'M') + { + /* Initializer scope for a lambda. We don't need to represent + this; the normal code will just treat the variable as a type + scope, which gives appropriate output. */ + if (ret == NULL) + return NULL; + d_advance (di, 1); + continue; + } else return NULL; @@ -1343,6 +1396,18 @@ d_unqualified_name (struct d_info *di) return NULL; return ret; } + else if (peek == 'U') + { + switch (d_peek_next_char (di)) + { + case 'l': + return d_lambda (di); + case 't': + return d_unnamed_type (di); + default: + return NULL; + } + } else return NULL; } @@ -1396,6 +1461,20 @@ d_number (struct d_info *di) } } +/* Like d_number, but returns a demangle_component. */ + +static struct demangle_component * +d_number_component (struct d_info *di) +{ + struct demangle_component *ret = d_make_empty (di); + if (ret) + { + ret->type = DEMANGLE_COMPONENT_NUMBER; + ret->u.s_number.number = d_number (di); + } + return ret; +} + /* identifier ::= <(unqualified source code identifier)> */ static struct demangle_component * @@ -1924,6 +2003,8 @@ cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT] = /* 29 */ { NL ("half"), NL ("half"), D_PRINT_FLOAT }, /* 30 */ { NL ("char16_t"), NL ("char16_t"), D_PRINT_DEFAULT }, /* 31 */ { NL ("char32_t"), NL ("char32_t"), D_PRINT_DEFAULT }, + /* 32 */ { NL ("decltype(nullptr)"), NL ("decltype(nullptr)"), + D_PRINT_DEFAULT }, }; CP_STATIC_IF_GLIBCPP_V3 @@ -2147,11 +2228,23 @@ cplus_demangle_type (struct d_info *di) /* For demangling we don't care about the bits. */ d_number (di); ret->u.s_fixed.length = cplus_demangle_type (di); + if (ret->u.s_fixed.length == NULL) + return NULL; d_number (di); peek = d_next_char (di); ret->u.s_fixed.sat = (peek == 's'); break; + case 'v': + ret = d_vector_type (di); + break; + + case 'n': + /* decltype(nullptr) */ + ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[32]); + di->expansion += ret->u.s_builtin.type->len; + break; + default: return NULL; } @@ -2238,50 +2331,30 @@ d_function_type (struct d_info *di) return ret; } -/* ::= [J]+ */ +/* + */ static struct demangle_component * -d_bare_function_type (struct d_info *di, int has_return_type) +d_parmlist (struct d_info *di) { - struct demangle_component *return_type; struct demangle_component *tl; struct demangle_component **ptl; - char peek; - - /* Detect special qualifier indicating that the first argument - is the return type. */ - peek = d_peek_char (di); - if (peek == 'J') - { - d_advance (di, 1); - has_return_type = 1; - } - return_type = NULL; tl = NULL; ptl = &tl; while (1) { struct demangle_component *type; - peek = d_peek_char (di); + char peek = d_peek_char (di); if (peek == '\0' || peek == 'E') break; type = cplus_demangle_type (di); if (type == NULL) return NULL; - if (has_return_type) - { - return_type = type; - has_return_type = 0; - } - else - { - *ptl = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, type, NULL); - if (*ptl == NULL) - return NULL; - ptl = &d_right (*ptl); - } + *ptl = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, type, NULL); + if (*ptl == NULL) + return NULL; + ptl = &d_right (*ptl); } /* There should be at least one parameter type besides the optional @@ -2296,10 +2369,45 @@ d_bare_function_type (struct d_info *di, int has_return_type) && d_left (tl)->u.s_builtin.type->print == D_PRINT_VOID) { di->expansion -= d_left (tl)->u.s_builtin.type->len; - tl = NULL; + d_left (tl) = NULL; + } + + return tl; +} + +/* ::= [J]+ */ + +static struct demangle_component * +d_bare_function_type (struct d_info *di, int has_return_type) +{ + struct demangle_component *return_type; + struct demangle_component *tl; + char peek; + + /* Detect special qualifier indicating that the first argument + is the return type. */ + peek = d_peek_char (di); + if (peek == 'J') + { + d_advance (di, 1); + has_return_type = 1; } - return d_make_comp (di, DEMANGLE_COMPONENT_FUNCTION_TYPE, return_type, tl); + if (has_return_type) + { + return_type = cplus_demangle_type (di); + if (return_type == NULL) + return NULL; + } + else + return_type = NULL; + + tl = d_parmlist (di); + if (tl == NULL) + return NULL; + + return d_make_comp (di, DEMANGLE_COMPONENT_FUNCTION_TYPE, + return_type, tl); } /* ::= */ @@ -2355,6 +2463,34 @@ d_array_type (struct d_info *di) cplus_demangle_type (di)); } +/* ::= Dv _ + ::= Dv _ _ */ + +static struct demangle_component * +d_vector_type (struct d_info *di) +{ + char peek; + struct demangle_component *dim; + + peek = d_peek_char (di); + if (peek == '_') + { + d_advance (di, 1); + dim = d_expression (di); + } + else + dim = d_number_component (di); + + if (dim == NULL) + return NULL; + + if (! d_check_char (di, '_')) + return NULL; + + return d_make_comp (di, DEMANGLE_COMPONENT_VECTOR_TYPE, dim, + cplus_demangle_type (di)); +} + /* ::= M <(class) type> <(member) type> */ static struct demangle_component * @@ -2401,6 +2537,24 @@ d_pointer_to_member_type (struct d_info *di) return d_make_comp (di, DEMANGLE_COMPONENT_PTRMEM_TYPE, cl, mem); } +/* _ */ + +static long +d_compact_number (struct d_info *di) +{ + long num; + if (d_peek_char (di) == '_') + num = 0; + else if (d_peek_char (di) == 'n') + return -1; + else + num = d_number (di) + 1; + + if (! d_check_char (di, '_')) + return -1; + return num; +} + /* ::= T_ ::= T <(parameter-2 non-negative) number> _ */ @@ -2413,17 +2567,8 @@ d_template_param (struct d_info *di) if (! d_check_char (di, 'T')) return NULL; - if (d_peek_char (di) == '_') - param = 0; - else - { - param = d_number (di); - if (param < 0) - return NULL; - param += 1; - } - - if (! d_check_char (di, '_')) + param = d_compact_number (di); + if (param < 0) return NULL; ++di->did_subs; @@ -2595,26 +2740,24 @@ d_expression (struct d_info *di) /* Function parameter used in a late-specified return type. */ int index; d_advance (di, 2); - if (d_peek_char (di) == '_') - index = 1; - else - { - index = d_number (di); - if (index < 0) - return NULL; - index += 2; - } - - if (! d_check_char (di, '_')) + index = d_compact_number (di); + if (index < 0) return NULL; return d_make_function_param (di, index); } - else if (IS_DIGIT (peek)) + else if (IS_DIGIT (peek) + || (peek == 'o' && d_peek_next_char (di) == 'n')) { /* We can get an unqualified name as an expression in the case of - a dependent member access, i.e. decltype(T().i). */ - struct demangle_component *name = d_unqualified_name (di); + a dependent function call, i.e. decltype(f(t)). */ + struct demangle_component *name; + + if (peek == 'o') + /* operator-function-id, i.e. operator+(t). */ + d_advance (di, 2); + + name = d_unqualified_name (di); if (name == NULL) return NULL; if (d_peek_char (di) == 'I') @@ -2672,10 +2815,18 @@ d_expression (struct d_info *di) { struct demangle_component *left; struct demangle_component *right; + const char *code = op->u.s_operator.op->code; left = d_expression (di); - if (!strcmp (op->u.s_operator.op->code, "cl")) + if (!strcmp (code, "cl")) right = d_exprlist (di); + else if (!strcmp (code, "dt") || !strcmp (code, "pt")) + { + right = d_unqualified_name (di); + if (d_peek_char (di) == 'I') + right = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, + right, d_template_args (di)); + } else right = d_expression (di); @@ -2798,10 +2949,31 @@ d_local_name (struct d_info *di) else { struct demangle_component *name; + int num = -1; + + if (d_peek_char (di) == 'd') + { + /* Default argument scope: d _. */ + d_advance (di, 1); + num = d_compact_number (di); + if (num < 0) + return NULL; + } name = d_name (di); - if (! d_discriminator (di)) - return NULL; + if (name) + switch (name->type) + { + /* Lambdas and unnamed types have internal discriminators. */ + case DEMANGLE_COMPONENT_LAMBDA: + case DEMANGLE_COMPONENT_UNNAMED_TYPE: + break; + default: + if (! d_discriminator (di)) + return NULL; + } + if (num >= 0) + name = d_make_default_arg (di, num, name); return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name); } } @@ -2825,6 +2997,75 @@ d_discriminator (struct d_info *di) return 1; } +/* ::= Ul E [ ] _ */ + +static struct demangle_component * +d_lambda (struct d_info *di) +{ + struct demangle_component *tl; + struct demangle_component *ret; + int num; + + if (! d_check_char (di, 'U')) + return NULL; + if (! d_check_char (di, 'l')) + return NULL; + + tl = d_parmlist (di); + if (tl == NULL) + return NULL; + + if (! d_check_char (di, 'E')) + return NULL; + + num = d_compact_number (di); + if (num < 0) + return NULL; + + ret = d_make_empty (di); + if (ret) + { + ret->type = DEMANGLE_COMPONENT_LAMBDA; + ret->u.s_unary_num.sub = tl; + ret->u.s_unary_num.num = num; + } + + if (! d_add_substitution (di, ret)) + return NULL; + + return ret; +} + +/* ::= Ut [ ] _ */ + +static struct demangle_component * +d_unnamed_type (struct d_info *di) +{ + struct demangle_component *ret; + long num; + + if (! d_check_char (di, 'U')) + return NULL; + if (! d_check_char (di, 't')) + return NULL; + + num = d_compact_number (di); + if (num < 0) + return NULL; + + ret = d_make_empty (di); + if (ret) + { + ret->type = DEMANGLE_COMPONENT_UNNAMED_TYPE; + ret->u.s_number.number = num; + } + + if (! d_add_substitution (di, ret)) + return NULL; + + return ret; +} + /* Add a new substitution. */ static int @@ -3060,6 +3301,7 @@ d_print_init (struct d_print_info *dpi, int options, dpi->last_char = '\0'; dpi->templates = NULL; dpi->modifiers = NULL; + dpi->flush_count = 0; dpi->callback = callback; dpi->opaque = opaque; @@ -3089,6 +3331,7 @@ d_print_flush (struct d_print_info *dpi) dpi->buf[dpi->len] = '\0'; dpi->callback (dpi->buf, dpi->len, dpi->opaque); dpi->len = 0; + dpi->flush_count++; } /* Append characters and buffers for printing. */ @@ -3118,6 +3361,14 @@ d_append_string (struct d_print_info *dpi, const char *s) d_append_buffer (dpi, s, strlen (s)); } +static inline void +d_append_num (struct d_print_info *dpi, long l) +{ + char buf[25]; + sprintf (buf,"%ld", l); + d_append_string (dpi, buf); +} + static inline char d_last_char (struct d_print_info *dpi) { @@ -3243,6 +3494,7 @@ d_find_pack (struct d_print_info *dpi, case DEMANGLE_COMPONENT_PACK_EXPANSION: return NULL; + case DEMANGLE_COMPONENT_LAMBDA: case DEMANGLE_COMPONENT_NAME: case DEMANGLE_COMPONENT_OPERATOR: case DEMANGLE_COMPONENT_BUILTIN_TYPE: @@ -3394,6 +3646,8 @@ d_print_comp (struct d_print_info *dpi, struct demangle_component *local_name; local_name = d_right (typed_name); + if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG) + local_name = local_name->u.s_unary_num.sub; while (local_name->type == DEMANGLE_COMPONENT_RESTRICT_THIS || local_name->type == DEMANGLE_COMPONENT_VOLATILE_THIS || local_name->type == DEMANGLE_COMPONENT_CONST_THIS) @@ -3767,6 +4021,7 @@ d_print_comp (struct d_print_info *dpi, } case DEMANGLE_COMPONENT_PTRMEM_TYPE: + case DEMANGLE_COMPONENT_VECTOR_TYPE: { struct d_print_mod dpm; @@ -3781,11 +4036,7 @@ d_print_comp (struct d_print_info *dpi, /* If the modifier didn't get printed by the type, print it now. */ if (! dpm.printed) - { - d_append_char (dpi, ' '); - d_print_comp (dpi, d_left (dc)); - d_append_string (dpi, "::*"); - } + d_print_mod (dpi, dc); dpi->modifiers = dpm.next; @@ -3815,12 +4066,18 @@ d_print_comp (struct d_print_info *dpi, if (d_right (dc) != NULL) { size_t len; + unsigned long int flush_count; + /* Make sure ", " isn't flushed by d_append_string, otherwise + dpi->len -= 2 wouldn't work. */ + if (dpi->len >= sizeof (dpi->buf) - 2) + d_print_flush (dpi); d_append_string (dpi, ", "); len = dpi->len; + flush_count = dpi->flush_count; d_print_comp (dpi, d_right (dc)); /* If that didn't print anything (which can happen with empty template argument packs), remove the comma and space. */ - if (dpi->len == len) + if (dpi->flush_count == flush_count && dpi->len == len) dpi->len -= 2; } return; @@ -3876,9 +4133,18 @@ d_print_comp (struct d_print_info *dpi, d_append_char (dpi, '('); d_print_subexpr (dpi, d_left (d_right (dc))); - if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") != 0) - d_print_expr_op (dpi, d_left (dc)); - d_print_subexpr (dpi, d_right (d_right (dc))); + if (strcmp (d_left (dc)->u.s_operator.op->code, "ix") == 0) + { + d_append_char (dpi, '['); + d_print_comp (dpi, d_right (d_right (dc))); + d_append_char (dpi, ']'); + } + else + { + if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") != 0) + d_print_expr_op (dpi, d_left (dc)); + d_print_subexpr (dpi, d_right (d_right (dc))); + } if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR && d_left (dc)->u.s_operator.op->len == 1 @@ -3996,6 +4262,10 @@ d_print_comp (struct d_print_info *dpi, } return; + case DEMANGLE_COMPONENT_NUMBER: + d_append_num (dpi, dc->u.s_number.number); + return; + case DEMANGLE_COMPONENT_JAVA_RESOURCE: d_append_string (dpi, "java resource "); d_print_comp (dpi, d_left (dc)); @@ -4044,13 +4314,34 @@ d_print_comp (struct d_print_info *dpi, return; case DEMANGLE_COMPONENT_FUNCTION_PARAM: - { - char buf[25]; - d_append_string (dpi, "parm#"); - sprintf(buf,"%ld", dc->u.s_number.number); - d_append_string (dpi, buf); - return; - } + d_append_string (dpi, "{parm#"); + d_append_num (dpi, dc->u.s_number.number + 1); + d_append_char (dpi, '}'); + return; + + case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS: + d_append_string (dpi, "global constructors keyed to "); + d_print_comp (dpi, dc->u.s_binary.left); + return; + + case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS: + d_append_string (dpi, "global destructors keyed to "); + d_print_comp (dpi, dc->u.s_binary.left); + return; + + case DEMANGLE_COMPONENT_LAMBDA: + d_append_string (dpi, "{lambda("); + d_print_comp (dpi, dc->u.s_unary_num.sub); + d_append_string (dpi, ")#"); + d_append_num (dpi, dc->u.s_unary_num.num + 1); + d_append_char (dpi, '}'); + return; + + case DEMANGLE_COMPONENT_UNNAMED_TYPE: + d_append_string (dpi, "{unnamed type#"); + d_append_num (dpi, dc->u.s_number.number + 1); + d_append_char (dpi, '}'); + return; default: d_print_error (dpi); @@ -4170,6 +4461,15 @@ d_print_mod_list (struct d_print_info *dpi, d_append_char (dpi, '.'); dc = d_right (mods->mod); + + if (dc->type == DEMANGLE_COMPONENT_DEFAULT_ARG) + { + d_append_string (dpi, "{default arg#"); + d_append_num (dpi, dc->u.s_unary_num.num + 1); + d_append_string (dpi, "}::"); + dc = dc->u.s_unary_num.sub; + } + while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS || dc->type == DEMANGLE_COMPONENT_CONST_THIS) @@ -4238,6 +4538,12 @@ d_print_mod (struct d_print_info *dpi, case DEMANGLE_COMPONENT_TYPED_NAME: d_print_comp (dpi, d_left (mod)); return; + case DEMANGLE_COMPONENT_VECTOR_TYPE: + d_append_string (dpi, " __vector("); + d_print_comp (dpi, d_left (mod)); + d_append_char (dpi, ')'); + return; + default: /* Otherwise, we have something that won't go back on the modifier stack, so we can just print it. */ @@ -4254,20 +4560,17 @@ d_print_function_type (struct d_print_info *dpi, struct d_print_mod *mods) { int need_paren; - int saw_mod; int need_space; struct d_print_mod *p; struct d_print_mod *hold_modifiers; need_paren = 0; - saw_mod = 0; need_space = 0; for (p = mods; p != NULL; p = p->next) { if (p->printed) break; - saw_mod = 1; switch (p->mod->type) { case DEMANGLE_COMPONENT_POINTER: @@ -4296,9 +4599,6 @@ d_print_function_type (struct d_print_info *dpi, break; } - if (d_left (dc) != NULL && ! saw_mod) - need_paren = 1; - if (need_paren) { if (! need_space) @@ -4482,33 +4782,30 @@ static int d_demangle_callback (const char *mangled, int options, demangle_callbackref callback, void *opaque) { - int type; + enum + { + DCT_TYPE, + DCT_MANGLED, + DCT_GLOBAL_CTORS, + DCT_GLOBAL_DTORS + } + type; struct d_info di; struct demangle_component *dc; int status; if (mangled[0] == '_' && mangled[1] == 'Z') - type = 0; + type = DCT_MANGLED; else if (strncmp (mangled, "_GLOBAL_", 8) == 0 && (mangled[8] == '.' || mangled[8] == '_' || mangled[8] == '$') && (mangled[9] == 'D' || mangled[9] == 'I') && mangled[10] == '_') - { - const char *intro; - - intro = (mangled[9] == 'I') - ? "global constructors keyed to " - : "global destructors keyed to "; - - callback (intro, strlen (intro), opaque); - callback (mangled + 11, strlen (mangled + 11), opaque); - return 1; - } + type = mangled[9] == 'I' ? DCT_GLOBAL_CTORS : DCT_GLOBAL_DTORS; else { if ((options & DMGL_TYPES) == 0) return 0; - type = 1; + type = DCT_TYPE; } cplus_demangle_init_info (mangled, options, strlen (mangled), &di); @@ -4525,10 +4822,26 @@ d_demangle_callback (const char *mangled, int options, di.subs = alloca (di.num_subs * sizeof (*di.subs)); #endif - if (type) - dc = cplus_demangle_type (&di); - else - dc = cplus_demangle_mangled_name (&di, 1); + switch (type) + { + case DCT_TYPE: + dc = cplus_demangle_type (&di); + break; + case DCT_MANGLED: + dc = cplus_demangle_mangled_name (&di, 1); + break; + case DCT_GLOBAL_CTORS: + case DCT_GLOBAL_DTORS: + d_advance (&di, 11); + dc = d_make_comp (&di, + (type == DCT_GLOBAL_CTORS + ? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS + : DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS), + d_make_demangle_mangled_name (&di, d_str (&di)), + NULL); + d_advance (&di, strlen (d_str (&di))); + break; + } /* If DMGL_PARAMS is set, then if we didn't consume the entire mangled string, then we didn't successfully demangle it. If @@ -4573,7 +4886,7 @@ d_demangle (const char *mangled, int options, size_t *palc) return NULL; } - *palc = dgs.allocation_failure ? 1 : 0; + *palc = dgs.allocation_failure ? 1 : dgs.alc; return dgs.buf; } diff --git a/cp-demangle.h b/cp-demangle.h index aad3743..ae635be 100644 --- a/cp-demangle.h +++ b/cp-demangle.h @@ -1,5 +1,6 @@ /* Internal demangler interface for g++ V3 ABI. - Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. + Copyright (C) 2003, 2004, 2005, 2006, 2007, 2010 + Free Software Foundation, Inc. Written by Ian Lance Taylor . This file is part of the libiberty library, which is part of GCC. @@ -147,7 +148,7 @@ struct d_info extern const struct demangle_operator_info cplus_demangle_operators[]; #endif -#define D_BUILTIN_TYPE_COUNT (32) +#define D_BUILTIN_TYPE_COUNT (33) CP_STATIC_IF_GLIBCPP_V3 const struct demangle_builtin_type_info diff --git a/cplus-dem.c b/cplus-dem.c index 6838d8c..bb63418 100644 --- a/cplus-dem.c +++ b/cplus-dem.c @@ -36,6 +36,7 @@ Boston, MA 02110-1301, USA. */ realloc except that they generate a fatal error if there is no available memory. */ + #define xmalloc malloc #define xrealloc realloc #define xstrdup strdup @@ -125,8 +126,6 @@ char * realloc (); #undef CURRENT_DEMANGLING_STYLE #define CURRENT_DEMANGLING_STYLE work->options -static char *ada_demangle (const char *, int); - #define min(X,Y) (((X) < (Y)) ? (X) : (Y)) /* A value at least one greater than the maximum number of characters @@ -905,6 +904,9 @@ cplus_demangle_name_to_style (const char *name) the compilation system, are presumed to have already been stripped from MANGLED. */ +char *ada_demangle (const char *mangled, int options) +{ return NULL; } + char * cplus_demangle (const char *mangled, int options) { @@ -959,111 +961,6 @@ grow_vect (char **old_vect, size_t *size, size_t min_size, int element_size) } } -/* Demangle ada names: - 1. Discard final __{DIGIT}+ or ${DIGIT}+ - 2. Convert other instances of embedded "__" to `.'. - 3. Discard leading _ada_. - 4. Remove everything after first ___ if it is followed by 'X'. - 5. Put symbols that should be suppressed in <...> brackets. - The resulting string is valid until the next call of ada_demangle. */ - -static char * -ada_demangle (const char *mangled, int option) -{ - int i, j; - int len0; - const char* p; - char *demangled = NULL; - int changed; - size_t demangled_size = 0; - - changed = 0; - - if (strncmp (mangled, "_ada_", 5) == 0) - { - mangled += 5; - changed = 1; - } - - if (mangled[0] == '_' || mangled[0] == '<') - goto Suppress; - - p = strstr (mangled, "___"); - if (p == NULL) - len0 = strlen (mangled); - else - { - if (p[3] == 'X') - { - len0 = p - mangled; - changed = 1; - } - else - goto Suppress; - } - - /* Make demangled big enough for possible expansion by operator name. */ - grow_vect (&demangled, - &demangled_size, 2 * len0 + 1, - sizeof (char)); - - if (ISDIGIT ((unsigned char) mangled[len0 - 1])) { - for (i = len0 - 2; i >= 0 && ISDIGIT ((unsigned char) mangled[i]); i -= 1) - ; - if (i > 1 && mangled[i] == '_' && mangled[i - 1] == '_') - { - len0 = i - 1; - changed = 1; - } - else if (mangled[i] == '$') - { - len0 = i; - changed = 1; - } - } - - for (i = 0, j = 0; i < len0 && ! ISALPHA ((unsigned char)mangled[i]); - i += 1, j += 1) - demangled[j] = mangled[i]; - - while (i < len0) - { - if (i < len0 - 2 && mangled[i] == '_' && mangled[i + 1] == '_') - { - demangled[j] = '.'; - changed = 1; - i += 2; j += 1; - } - else - { - demangled[j] = mangled[i]; - i += 1; j += 1; - } - } - demangled[j] = '\000'; - - for (i = 0; demangled[i] != '\0'; i += 1) - if (ISUPPER ((unsigned char)demangled[i]) || demangled[i] == ' ') - goto Suppress; - - if (! changed) - return NULL; - else - return demangled; - - Suppress: - grow_vect (&demangled, - &demangled_size, strlen (mangled) + 3, - sizeof (char)); - - if (mangled[0] == '<') - strcpy (demangled, mangled); - else - sprintf (demangled, "<%s>", mangled); - - return demangled; -} - /* This function performs most of what cplus_demangle use to do, but to be able to demangle a name with a B, K or n code, we need to have a longer term memory of what types have been seen. The original diff --git a/demangle.h b/demangle.h index 2b031ec..963523f 100644 --- a/demangle.h +++ b/demangle.h @@ -1,6 +1,6 @@ /* Defs for interface to demanglers. Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, - 2003, 2004, 2005, 2007 Free Software Foundation, Inc. + 2003, 2004, 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License @@ -30,6 +30,7 @@ #if !defined (DEMANGLE_H) #define DEMANGLE_H + #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ @@ -185,6 +186,9 @@ java_demangle_v3_callback (const char *mangled, extern char* java_demangle_v3 (const char *mangled); +char * +ada_demangle (const char *mangled, int options); + enum gnu_v3_ctor_kinds { gnu_v3_complete_object_ctor = 1, gnu_v3_base_object_ctor, @@ -348,6 +352,9 @@ enum demangle_component_type DEMANGLE_COMPONENT_PTRMEM_TYPE, /* A fixed-point type. */ DEMANGLE_COMPONENT_FIXED_TYPE, + /* A vector type. The left subtree is the number of elements, + the right subtree is the element type. */ + DEMANGLE_COMPONENT_VECTOR_TYPE, /* An argument list. The left subtree is the current argument, and the right subtree is either NULL or another ARGLIST node. */ DEMANGLE_COMPONENT_ARGLIST, @@ -400,8 +407,20 @@ enum demangle_component_type DEMANGLE_COMPONENT_COMPOUND_NAME, /* A name formed by a single character. */ DEMANGLE_COMPONENT_CHARACTER, + /* A number. */ + DEMANGLE_COMPONENT_NUMBER, /* A decltype type. */ DEMANGLE_COMPONENT_DECLTYPE, + /* Global constructors keyed to name. */ + DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS, + /* Global destructors keyed to name. */ + DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS, + /* A lambda closure type. */ + DEMANGLE_COMPONENT_LAMBDA, + /* A default argument scope. */ + DEMANGLE_COMPONENT_DEFAULT_ARG, + /* An unnamed type. */ + DEMANGLE_COMPONENT_UNNAMED_TYPE, /* A pack expansion. */ DEMANGLE_COMPONENT_PACK_EXPANSION }; @@ -515,6 +534,14 @@ struct demangle_component struct demangle_component *right; } s_binary; + struct + { + /* subtree, same place as d_left. */ + struct demangle_component *sub; + /* integer. */ + int num; + } s_unary_num; + } u; }; From 070faf9d47bfaec538fa30cf0e01b4f8e5492fb7 Mon Sep 17 00:00:00 2001 From: seppel Date: Tue, 17 Jan 2012 15:54:23 +0000 Subject: [PATCH 19/53] *** empty log message *** --- ChangeLog | 1 + doc/ht.texi | 2 +- htinfo.h | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index be095ce..ed8ff99 100644 --- a/ChangeLog +++ b/ChangeLog @@ -9,6 +9,7 @@ version 2.0.19: - [x86] AVX2 - [x86] BMI, BMI2 and TBM instructions - fixed loading of ELF files with no section headers + - [Win32] Fixed loading of files with path length > 100 (thanks Vitaliy) version 2.0.18: - updated c++ demangler diff --git a/doc/ht.texi b/doc/ht.texi index 5a5afae..0119889 100644 --- a/doc/ht.texi +++ b/doc/ht.texi @@ -23,7 +23,7 @@ END-INFO-DIR-ENTRY This file documents the HT Editor. @c -Copyright @copyright{} 1999-2010 The HT authors. @* +Copyright @copyright{} 1999-2012 The HT authors. @* @xref{Authors, The HT Authors, The HT Authors}, for a list of the copyright holders. diff --git a/htinfo.h b/htinfo.h index 698cbd2..e9039b2 100644 --- a/htinfo.h +++ b/htinfo.h @@ -31,6 +31,6 @@ #define ht_author2 "Sebastian Biallas" #define ht_mail2 "sb@biallas.net" -#define ht_copyright2 "(c) 1999-2010 "ht_author2" <"ht_mail2">" +#define ht_copyright2 "(c) 1999-2012 "ht_author2" <"ht_mail2">" #endif /* !__HTINFO_H__ */ From a64f140cc4307270056c37565127a402469fba39 Mon Sep 17 00:00:00 2001 From: seppel Date: Tue, 17 Jan 2012 16:03:40 +0000 Subject: [PATCH 20/53] *** empty log message *** --- asm/x86opc.cc | 177 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 141 insertions(+), 36 deletions(-) diff --git a/asm/x86opc.cc b/asm/x86opc.cc index 8c64779..c97e2bb 100644 --- a/asm/x86opc.cc +++ b/asm/x86opc.cc @@ -2957,7 +2957,7 @@ x86opc_insn x86_special_group_insns[X86_SPECIAL_GROUPS][9] = { {"xsetbv"}, {0}, {0}, -{0}, +{"vmfunc"}, {0}, {0}, {0}, @@ -3410,41 +3410,54 @@ x86opc_finsn x86_float_group_insns[8][8] = { #define Elast {0}}; E0(00) {"vpshufb", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vpshufb", _256|_66|_0f38, {Yy, YVy, Xy}}, {"vpermq", _256|_66|_0f3a|W1, {Yy, Xy, Ib}}, E(01) -{"vhaddw", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"pvhaddw", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vphaddw", _256|_66|_0f38, {Yy, YVy, Xy}}, {"vpermpd", _256|_66|_0f3a|W1, {Yy, Xy, Ib}}, E(02) -{"vhaddd", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vphaddd", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vphaddd", _256|_66|_0f38, {Yy, YVy, Xy}}, {"vpblendd", _128|_66|_0f3a|W0, {Vo, VVo, Wo, Ib}}, +{"vpblendd", _256|_66|_0f3a|W0, {Yy, YVy, Xy, Ib}}, E(03) -{"vhaddsw", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vphaddsw", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vphaddsw", _256|_66|_0f38, {Yy, YVy, Xy}}, E(04) {"vpermilps", _128|_66|_0f3a, {Vo, Wo, Ib}}, {"vpermilps", _256|_66|_0f3a, {Yy, Xy, Ib}}, -{"vmaddubsw", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vpmaddubsw", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vpmaddubsw", _256|_66|_0f38, {Yy, YVy, Xy}}, E(05) {"vphsubw", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vphsubw", _256|_66|_0f38, {Yy, YVy, Xy}}, {"vpermilpd", _128|_66|_0f3a, {Vo, Wo, Ib}}, {"vpermilpd", _256|_66|_0f3a, {Yy, Xy, Ib}}, E(06) {"vphsubd", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vphsubd", _256|_66|_0f38, {Yy, YVy, Xy}}, {"vperm2f128", _256|_66|_0f3a, {Yy, YVy, Xy, Ib}}, E(07) {"vphsubsw", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vphsubsw", _256|_66|_0f38, {Yy, YVy, Xy}}, E(08) {"vpsignb", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vpsignb", _256|_66|_0f38, {Yy, YVy, Xy}}, {"vroundps", _128|_66|_0f3a, {Vo, Wo, Ib}}, {"vroundps", _256|_66|_0f3a, {Yy, Xy, Ib}}, E(09) {"vpsignw", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vpsignw", _256|_66|_0f38, {Yy, YVy, Xy}}, {"vroundpd", _128|_66|_0f3a, {Vo, Wo, Ib}}, {"vroundpd", _256|_66|_0f3a, {Yy, Xy, Ib}}, E(0a) {"vpsignd", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vpsignd", _256|_66|_0f38, {Yy, YVy, Xy}}, {"vroundss", _128|_66|_0f3a, {Vo, Wo, Ib}}, E(0b) -{"vpmulhrsw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpmulhrsw", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vpmulhrsw", _256|_66|_0f38, {Yy, YVy, Xy}}, {"vroundsd", _128|_66|_0f3a, {Vo, Wo, Ib}}, E(0c) {"vblendps", _128|_66|_0f3a, {Vo, VVo, Wo, Ib}}, @@ -3458,10 +3471,12 @@ E(0d) {"vblendpd", _256|_66|_0f3a, {Yy, YVy, Xy, Ib}}, E(0e) {"vpblendw", _128|_66|_0f3a, {Vo, VVo, Wo, Ib}}, +{"vpblendw", _256|_66|_0f3a, {Yy, YVy, Xy, Ib}}, {"vptestps", _128|_66|_0f38, {Vo, Wo}}, {"vptestps", _256|_66|_0f38, {Yy, Xy}}, E(0f) {"vpalignr", _128|_66|_0f3a, {Vo, VVo, Wo, Ib}}, +{"vpalignr", _256|_66|_0f3a, {Yy, YVy, Xy, Ib}}, {"vptestpd", _128|_66|_0f38, {Vo, Wo}}, {"vptestpd", _256|_66|_0f38, {Yy, Xy}}, E(10) @@ -3530,46 +3545,58 @@ E(17) {"vptest", _128|_66|_0f38, {Vo, Wo}}, {"vptest", _256|_66|_0f38, {Yy, Xy}}, E(18) -{"vbroadcastss", _128|_66|_0f38, {Vo, Xd}}, -{"vbroadcastss", _256|_66|_0f38, {Yy, Xd}}, +{"vbroadcastss", _128|_66|_0f38, {Vo, Wd}}, +{"vbroadcastss", _256|_66|_0f38, {Yy, Wd}}, {"vinsertf128", _256|_66|_0f3a, {Yy, YVy, Xy, Ib}}, E(19) -{"vbroadcastsd", _256|_66|_0f38, {Yy, Xq}}, +{"vbroadcastsd", _128|_66|_0f38, {Vo, Wq}}, +{"vbroadcastsd", _256|_66|_0f38, {Yy, Wq}}, {"vextractf128", _256|_66|_0f3a, {Xy, Yy, Ib}}, E(1a) -{"vbroadcastf128", _256|_66|_0f38, {Yy, My}}, +{"vbroadcastf128", _256|_66|_0f38, {Yy, Mo}}, E(1c) {"vpabsb", _128|_66|_0f38, {Vo, Wo}}, +{"vpabsb", _256|_66|_0f38, {Yy, Xy}}, E(1d) {"vpabsw", _128|_66|_0f38, {Vo, Wo}}, +{"vpabsw", _256|_66|_0f38, {Yy, Xy}}, {"vcvtps2ph", _128|_66|_0f3a, {Wq, Vo, Ib}}, {"vcvtps2ph", _256|_66|_0f3a, {Wo, Yy, Ib}}, E(1e) {"vpabsd", _128|_66|_0f38, {Vo, Wo}}, +{"vpabsd", _256|_66|_0f38, {Yy, Xy}}, E(20) {"vpinsrb", _128|_66|_0f3a, {Vo, VVo, MRbd, Ib}}, {"vpmovsxbw", _128|_66|_0f38, {Vo, Wq}}, +{"vpmovsxbw", _256|_66|_0f38, {Yy, Wo}}, E(21) {"vinsertps", _128|_66|_0f3a, {Vo, VVo, Wd, Ib}}, {"vpmovsxbd", _128|_66|_0f38, {Vo, Wd}}, +{"vpmovsxbd", _256|_66|_0f38, {Yy, Wq}}, E(22) {"vpinsrd", _128|_66|_0f3a|W0, {Vo, VVo, Ed, Ib}}, {"vpinsrq", _128|_66|_0f3a|W1, {Vo, VVo, Eq, Ib}}, {"vpmovsxbq", _128|_66|_0f38, {Vo, Ww}}, +{"vpmovsxbq", _256|_66|_0f38, {Yy, Wd}}, E(23) {"vpmovsxwd", _128|_66|_0f38, {Vo, Wq}}, +{"vpmovsxwd", _256|_66|_0f38, {Yy, Wo}}, E(24) {"vpmovsxwq", _128|_66|_0f38, {Vo, Wd}}, +{"vpmovsxwq", _256|_66|_0f38, {Yy, Wq}}, E(25) {"vpmovsxdq", _128|_66|_0f38, {Vo, Wq}}, +{"vpmovsxdq", _256|_66|_0f38, {Yy, Wo}}, E(28) {"vmovapd", _128|_66|_0f, {Vo, Wo}}, {"vmovapd", _256|_66|_0f, {Yy, Xy}}, {"vpmuldq", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vpmuldq", _256|_66|_0f38, {Yy, YVy, Xy}}, E(29) {"vmovapd", _128|_66|_0f, {Wo, Vo}}, {"vmovapd", _256|_66|_0f, {Xy, Yy}}, {"vpcmpeqq", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vpcmpeqq", _256|_66|_0f38, {Yy, YVy, Xy}}, E(2a) {"vmovntdqa", _128|_66|_0f38, {Vo, Mo}}, {"vmovntdqa", _256|_66|_0f38, {Yy, My}}, @@ -3583,6 +3610,7 @@ E(2b) {"vmovntpd", _128|_66|_0f, {Mo, Vo}}, {"vmovntpd", _256|_66|_0f, {My, Xy}}, {"vpackusdw", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vpackusdw", _256|_66|_0f38, {Yy, YVy, Xy}}, E(2c) {"vmaskmovps", _128|_66|_0f38, {Vo, VVo, Mo}}, {"vmaskmovps", _256|_66|_0f38, {Yy, YVy, My}}, @@ -3609,40 +3637,56 @@ E(2f) {"vcomisd", _128|_66|_0f, {Vo, Wq}}, E(30) {"vpmovzxbw", _128|_66|_0f38, {Vo, Wq}}, +{"vpmovzxbw", _256|_66|_0f38, {Yy, Wo}}, E(31) {"vpmovzxbd", _128|_66|_0f38, {Vo, Wd}}, +{"vpmovzxbd", _256|_66|_0f38, {Yy, Wq}}, E(32) {"vpmovzxbq", _128|_66|_0f38, {Vo, Ww}}, +{"vpmovzxbq", _256|_66|_0f38, {Yy, Wd}}, E(33) {"vpmovzxwd", _128|_66|_0f38, {Vo, Wq}}, +{"vpmovzxwd", _256|_66|_0f38, {Yy, Wo}}, E(34) {"vpmovzxwq", _128|_66|_0f38, {Vo, Wd}}, +{"vpmovzxwq", _256|_66|_0f38, {Yy, Wq}}, E(35) {"vpmovzxdq", _128|_66|_0f38, {Vo, Wq}}, +{"vpmovzxdq", _256|_66|_0f38, {Yy, Wo}}, E(36) {"vpermd", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, E(37) {"vpcmpgtq", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vpcmpgtq", _256|_66|_0f38, {Yy, YVy, Xy}}, E(38) {"vpminsb", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vpminsb", _256|_66|_0f38, {Yy, YVy, Xy}}, {"vinserti128", _256|_66|_0f3a, {Yy, YVy, Wo, Ib}}, E(39) {"vpminsd", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vpminsd", _256|_66|_0f38, {Yy, YVy, Xy}}, {"vextracti128", _256|_66|_0f3a, {Wo, Yy, Ib}}, E(3a) {"vpminuw", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vpminuw", _256|_66|_0f38, {Yy, YVy, Xy}}, E(3b) {"vpminud", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vpminud", _256|_66|_0f38, {Yy, YVy, Xy}}, E(3c) {"vpmaxsb", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vpmaxsb", _256|_66|_0f38, {Yy, YVy, Xy}}, E(3d) {"vpmaxsd", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vpmaxsd", _256|_66|_0f38, {Yy, YVy, Xy}}, E(3e) {"vpmaxuw", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vpmaxuw", _256|_66|_0f38, {Yy, YVy, Xy}}, E(3f) {"vpmaxud", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vpmaxud", _256|_66|_0f38, {Yy, YVy, Xy}}, E(40) {"vpmulld", _128|_66|_0f38, {Vo, VVo, Wo}}, +{"vpmulld", _256|_66|_0f38, {Yy, YVy, Xy}}, {"vdpps", _128|_66|_0f3a, {Vo, VVo, Wo, Ib}}, {"vdpps", _256|_66|_0f3a, {Yy, YVy, Xy, Ib}}, E(41) @@ -3650,6 +3694,7 @@ E(41) {"vphminposuw", _128|_66|_0f38, {Vo, Wo}}, E(42) {"vmpsadbw", _128|_66|_0f3a, {Vo, VVo, Wo, Ib}}, +{"vmpsadbw", _256|_66|_0f3a, {Yy, YVy, Xy, Ib}}, E(44) {"vpclmulqdq", _128|_66|_0f3a, {Vo, VVo, Wo, Ib}}, E(45) @@ -3660,7 +3705,7 @@ E(45) E(46) {"vpsravd", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, {"vpsravd", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, -{"vpermi128", _256|_66|_0f3a|W0, {Yy, YVy, Xy, Ib}}, +{"vperm2i128", _256|_66|_0f3a|W0, {Yy, YVy, Xy, Ib}}, E(47) {"vpsllvd", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, {"vpsllvd", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, @@ -3684,6 +3729,7 @@ E(4b) {"vblendvpd", _256|_66|_0f3a, {Yy, YVy, Xy, YIy}}, E(4c) {"vpblendvb", _128|_66|_0f3a, {Vo, VVo, Wo, VIo}}, +{"vpblendvb", _256|_66|_0f3a, {Yy, YVy, Xy, VIo}}, E(50) {"vmovmskps", _128|_0f, {Gd, VRo}}, {"vmovmskps", _256|_0f, {Gd, YRy}}, @@ -3747,7 +3793,7 @@ E(5a) {"vcvtpd2ps", _256|_66|_0f, {Yy, Xy}}, {"vcvtss2sd", _128|_f3|_0f, {Vo, VVo, Wd}}, {"vcvtsd2ss", _128|_f2|_0f, {Vo, VVo, Wq}}, -{"vbroadcasti128", _256|_66|_0f38, {Yy, My}}, +{"vbroadcasti128", _256|_66|_0f38, {Yy, Mo}}, E(5b) {"vcvtdq2ps", _128|_0f, {Vo, Wo}}, {"vcvtdq2ps", _256|_0f, {Yy, Xy}}, @@ -3802,51 +3848,65 @@ E(5f) E(60) {"vpcmpestrm", _128|_66|_0f3a, {Vo, Wo, Ib}}, {"vpunpcklbw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpunpcklbw", _256|_66|_0f, {Yy, YVy, Xy}}, E(61) {"vpcmpestri", _128|_66|_0f3a, {Vo, Wo, Ib}}, {"vpunpcklwd", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpunpcklwd", _256|_66|_0f, {Yy, YVy, Xy}}, E(62) {"vpcmpistrm", _128|_66|_0f3a, {Vo, Wo, Ib}}, {"vpunpckldq", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpunpckldq", _256|_66|_0f, {Yy, YVy, Xy}}, E(63) {"vpcmpistri", _128|_66|_0f3a, {Vo, Wo, Ib}}, {"vpacksswb", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpacksswb", _256|_66|_0f, {Yy, YVy, Xy}}, E(64) {"vpcmpgtb", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpcmpgtb", _256|_66|_0f, {Yy, YVy, Xy}}, E(65) {"vpcmpgtw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpcmpgtw", _256|_66|_0f, {Yy, YVy, Xy}}, E(66) {"vpcmpgtd", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpcmpgtd", _256|_66|_0f, {Yy, YVy, Xy}}, E(67) {"vpackuswb", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpackuswb", _256|_66|_0f, {Yy, YVy, Xy}}, E(68) {"vpunpckhbw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpunpckhbw", _256|_66|_0f, {Yy, YVy, Xy}}, {"vfmaddps", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, {"vfmaddps", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, {"vfmaddps", _256|_66|_0f3a|W0, {Yy, YIy, YVy, Xy}}, {"vfmaddps", _256|_66|_0f3a|W1, {Yy, YIy, Xy, YVy}}, E(69) {"vpunpckhwd", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpunpckhwd", _256|_66|_0f, {Yy, YVy, Xy}}, {"vfmaddpd", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, {"vfmaddpd", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, {"vfmaddpd", _256|_66|_0f3a|W0, {Yy, YIy, YVy, Xy}}, {"vfmaddpd", _256|_66|_0f3a|W1, {Yy, YIy, Xy, YVy}}, E(6a) {"vpunpckhdq", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpunpckhdq", _256|_66|_0f, {Yy, YVy, Xy}}, {"vfmaddss", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, {"vfmaddss", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, E(6b) {"vpackssdw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpackssdw", _256|_66|_0f, {Yy, YVy, Xy}}, {"vfmaddsd", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, {"vfmaddsd", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, E(6c) {"vpunpcklqdq", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpunpcklqdq", _256|_66|_0f, {Yy, YVy, Xy}}, {"vfmsubps", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, {"vfmsubps", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, {"vfmsubps", _256|_66|_0f3a|W0, {Yy, YIy, YVy, Xy}}, {"vfmsubps", _256|_66|_0f3a|W1, {Yy, YIy, Xy, YVy}}, E(6d) {"vpunpckhqdq", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpunpckhqdq", _256|_66|_0f, {Yy, YVy, Xy}}, {"vfmsubpd", _128|_66|_0f3a|W0, {Vo, VIo, VVo, Wo}}, {"vfmsubpd", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, {"vfmsubpd", _256|_66|_0f3a|W0, {Yy, YIy, YVy, Xy}}, @@ -3865,8 +3925,11 @@ E(6f) {"vfmsubsd", _128|_66|_0f3a|W1, {Vo, VIo, Wo, VVo}}, E(70) {"vpshufd", _128|_66|_0f, {Vo, Wo, Ib}}, +{"vpshufd", _256|_66|_0f, {Yy, Xy, Ib}}, {"vpshufhw", _128|_f3|_0f, {Vo, Wo, Ib}}, +{"vpshufhw", _256|_f3|_0f, {Yy, Xy, Ib}}, {"vpshuflw", _128|_f2|_0f, {Vo, Wo, Ib}}, +{"vpshuflw", _256|_f2|_0f, {Yy, Xy, Ib}}, E(71) {0, _128|_66|_0f, {SPECIAL_TYPE_GROUP, GROUP_660F71}}, E(72) @@ -3875,10 +3938,13 @@ E(73) {0, _128|_66|_0f, {SPECIAL_TYPE_GROUP, GROUP_660F73}}, E(74) {"vpcmpeqb", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpcmpeqb", _256|_66|_0f, {Yy, YVy, Xy}}, E(75) {"vpcmpeqw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpcmpeqw", _256|_66|_0f, {Yy, YVy, Xy}}, E(76) {"vpcmpeqd", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpcmpeqd", _256|_66|_0f, {Yy, YVy, Xy}}, E(77) {"vzeroupper", _128|_0f}, {"vzeroall", _256|_0f}, @@ -3952,42 +4018,46 @@ E(86) E(87) {"vpmacssdql", _128|_0f24, {Vo, VVo, Wo, VIo}}, E(8c) -{"vpmaskmovd", _128|_66|_0f38|W0, {Vo, VVo, Wo}}, -{"vpmaskmovd", _256|_66|_0f38|W0, {Yy, YVy, Xy}}, -{"vpmaskmovq", _128|_66|_0f38|W1, {Vo, VVo, Wo}}, -{"vpmaskmovq", _256|_66|_0f38|W1, {Yy, YVy, Xy}}, +{"vpmaskmovd", _128|_66|_0f38|W0, {Vo, VVo, Mo}}, +{"vpmaskmovd", _256|_66|_0f38|W0, {Yy, YVy, My}}, +{"vpmaskmovq", _128|_66|_0f38|W1, {Vo, VVo, Mo}}, +{"vpmaskmovq", _256|_66|_0f38|W1, {Yy, YVy, My}}, E(8e) {"vpmacssdd", _128|_0f24, {Vo, VVo, Wo, VIo}}, -{"vpmaskmovd", _128|_66|_0f38|W0, {Wo, VVo, Vo}}, -{"vpmaskmovd", _256|_66|_0f38|W0, {Xy, YVy, Yy}}, -{"vpmaskmovq", _128|_66|_0f38|W1, {Wo, VVo, Vo}}, -{"vpmaskmovq", _256|_66|_0f38|W1, {Xy, YVy, Yy}}, +{"vpmaskmovd", _128|_66|_0f38|W0, {Mo, VVo, Vo}}, +{"vpmaskmovd", _256|_66|_0f38|W0, {My, YVy, Yy}}, +{"vpmaskmovq", _128|_66|_0f38|W1, {Mo, VVo, Vo}}, +{"vpmaskmovq", _256|_66|_0f38|W1, {My, YVy, Yy}}, E(8f) {"vpmacssdqh", _128|_0f24, {Vo, VVo, Wo, VIo}}, E(90) {"vprotb", _128|_0f25|W0, {Vo, Wo, VVo}}, {"vprotb", _128|_0f25|W1, {Vo, VVo, Wo}}, -{"vpgatherdd", _128|_66|_0f38|W0, {Vo, Wo, VVo}}, -{"vpgatherdd", _256|_66|_0f38|W0, {Yy, Xy, YVy}}, -{"vpgatherdq", _128|_66|_0f38|W1, {Vo, Wo, VVo}}, -{"vpgatherdq", _256|_66|_0f38|W1, {Yy, Xy, YVy}}, +{"vpgatherdd", _128|_66|_0f38|W0, {Vo, Wd, VVo}}, +{"vpgatherdd", _256|_66|_0f38|W0, {Yy, Xd, YVy}}, +{"vpgatherdq", _128|_66|_0f38|W1, {Vo, Wd, VVo}}, +{"vpgatherdq", _256|_66|_0f38|W1, {Yy, Xd, YVy}}, E(91) {"vprotw", _128|_0f25|W0, {Vo, Wo, VVo}}, {"vprotw", _128|_0f25|W1, {Vo, VVo, Wo}}, -{"vpgatherqd", _128|_66|_0f38|W0, {Vo, Wo, VVo}}, -{"vpgatherqd", _256|_66|_0f38|W0, {Yy, Xy, YVy}}, -{"vpgatherqq", _128|_66|_0f38|W1, {Vo, Wo, VVo}}, -{"vpgatherqq", _256|_66|_0f38|W1, {Yy, Xy, YVy}}, +{"vpgatherqd", _128|_66|_0f38|W0, {Vo, Wq, VVo}}, +{"vpgatherqd", _256|_66|_0f38|W0, {Yy, Xq, YVy}}, +{"vpgatherqq", _128|_66|_0f38|W1, {Vo, Wq, VVo}}, +{"vpgatherqq", _256|_66|_0f38|W1, {Yy, Xq, YVy}}, E(92) {"vprotd", _128|_0f25|W0, {Vo, Wo, VVo}}, {"vprotd", _128|_0f25|W1, {Vo, VVo, Wo}}, -{"vgatherdps", _128|_66|_0f38|W0, {Vo, Wo, VVo}}, -{"vgatherdps", _256|_66|_0f38|W0, {Yy, Xy, YVy}}, +{"vgatherdps", _128|_66|_0f38|W0, {Vo, Wd, VVo}}, +{"vgatherdps", _256|_66|_0f38|W0, {Yy, Xd, YVy}}, +{"vgatherdpd", _128|_66|_0f38|W1, {Vo, Wd, VVo}}, +{"vgatherdpd", _256|_66|_0f38|W1, {Yy, Xd, YVy}}, E(93) {"vprotq", _128|_0f25|W0, {Vo, Wo, VVo}}, {"vprotq", _128|_0f25|W1, {Vo, VVo, Wo}}, -{"vgatherqps", _128|_66|_0f38|W0, {Vo, Wo, VVo}}, -{"vgatherqps", _256|_66|_0f38|W0, {Yy, Xy, YVy}}, +{"vgatherqps", _128|_66|_0f38|W0, {Vo, Wq, VVo}}, +{"vgatherqps", _256|_66|_0f38|W0, {Yy, Xq, YVy}}, +{"vgatherqpd", _128|_66|_0f38|W1, {Vo, Wq, VVo}}, +{"vgatherqpd", _256|_66|_0f38|W1, {Yy, Xq, YVy}}, E(94) {"vpshlb", _128|_0f25|W0, {Vo, Wo, VVo}}, {"vpshlb", _128|_0f25|W1, {Vo, VVo, Wo}}, @@ -4194,49 +4264,64 @@ E(d0) {"vaddsubss", _256|_f2|_0f, {Yy, YVy, Xy}}, E(d1) {"vpsrlw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpsrlw", _256|_66|_0f, {Yy, YVy, Xy}}, {"vphaddubw", _128|_0f25, {Vo, Wo}}, E(d2) {"vpsrld", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpsrld", _256|_66|_0f, {Yy, YVy, Xy}}, {"vphaddubd", _128|_0f25, {Vo, Wo}}, E(d3) {"vpsrlq", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpsrlq", _256|_66|_0f, {Yy, YVy, Xy}}, {"vphaddubq", _128|_0f25, {Vo, Wo}}, E(d4) {"vpaddq", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpaddq", _256|_66|_0f, {Yy, YVy, Xy}}, E(d5) {"vpmullw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpmullw", _256|_66|_0f, {Yy, YVy, Xy}}, E(d6) {"vmovq", _128|_66|_0f, {Wq, Vo}}, {"vphadduwd", _128|_0f25, {Vo, Wo}}, E(d7) {"vpmovmskb", _128|_66|_0f, {Gd, VRo}}, +{"vpmovmskb", _256|_66|_0f, {Gq, YRy}}, {"vphadduwq", _128|_0f25, {Vo, Wo}}, {"vphaddwq", _128|_0f25, {Vo, Wo}}, // FIXME E(d8) {"vpsubusb", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpsubusb", _256|_66|_0f, {Yy, YVy, Xy}}, E(d9) {"vpsubusw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpsubusw", _256|_66|_0f, {Yy, YVy, Xy}}, E(da) {"vpminub", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpminub", _256|_66|_0f, {Yy, YVy, Xy}}, E(db) {"vpand", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpand", _256|_66|_0f, {Yy, YVy, Xy}}, {"vaesimc", _128|_66|_0f38, {Vo, Wo}}, {"vphaddudq", _128|_0f25, {Vo, Wo}}, E(dc) {"vpaddusb", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpaddusb", _256|_66|_0f, {Yy, YVy, Xy}}, {"vaesenc", _128|_66|_0f38, {Vo, VVo, Wo}}, E(dd) {"vpaddusw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpaddusw", _256|_66|_0f, {Yy, YVy, Xy}}, {"vaesenclast", _128|_66|_0f38, {Vo, VVo, Wo}}, E(de) {"vpmaxub", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpmaxub", _256|_66|_0f, {Yy, YVy, Xy}}, {"vaesdec", _128|_66|_0f38, {Vo, VVo, Wo}}, E(df) {"vpandn", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpandn", _256|_66|_0f, {Yy, YVy, Xy}}, {"vaesdeclast", _128|_66|_0f38, {Vo, VVo, Wo}}, {"vaeskeygenassist", _128|_66|_0f3a, {Vo, Wo, Ib}}, E(e0) {"vpavgb", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpavgb", _256|_66|_0f, {Yy, YVy, Xy}}, E(e1) {"vpsraw", _128|_66|_0f, {Vo, VVo, Wo}}, {"vphsubbw", _128|_0f25, {Vo, Wo}}, @@ -4245,11 +4330,14 @@ E(e2) {"vphsubwd", _128|_0f25, {Vo, Wo}}, E(e3) {"vpavgw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpavgw", _256|_66|_0f, {Yy, YVy, Xy}}, {"vphsubdq", _128|_0f25, {Vo, Wo}}, E(e4) {"vpmulhuw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpmulhuw", _256|_66|_0f, {Yy, YVy, Xy}}, E(e5) {"vpmulhw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpmulhw", _256|_66|_0f, {Yy, YVy, Xy}}, E(e6) {"vcvtdq2pd", _128|_f3|_0f, {Vo, Wo}}, {"vcvtdq2pd", _256|_f3|_0f, {Yy, Xy}}, @@ -4262,20 +4350,27 @@ E(e7) {"vmovntdq", _256|_66|_0f, {My, Yy}}, E(e8) {"vpsubsb", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpsubsb", _256|_66|_0f, {Yy, YVy, Xy}}, E(e9) {"vpsubsw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpsubsw", _256|_66|_0f, {Yy, YVy, Xy}}, E(ea) {"vpminsw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpminsw", _256|_66|_0f, {Yy, YVy, Xy}}, E(eb) {"vpor", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpor", _256|_66|_0f, {Yy, YVy, Xy}}, E(ec) {"vpaddsb", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpaddsb", _256|_66|_0f, {Yy, YVy, Xy}}, {"vpcomub", _128|_0f24, {Vo, VVo, Wo, Ib}}, E(ed) {"vpaddsw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpaddsw", _256|_66|_0f, {Yy, YVy, Xy}}, {"vpcomuw", _128|_0f24, {Vo, VVo, Wo, Ib}}, E(ee) {"vpmaxsw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpmaxsw", _256|_66|_0f, {Yy, YVy, Xy}}, {"vpcomud", _128|_0f24, {Vo, VVo, Wo, Ib}}, E(ef) {"vpxor", _128|_66|_0f, {Vo, VVo, Wo}}, @@ -4297,17 +4392,20 @@ E(f3) {0, _128|_0f38|W1, {SPECIAL_TYPE_GROUP, GROUP_0F38_F3_W}}, {"vpsllq", _128|_66|_0f, {Vo, VVo, Wo}}, E(f4) -{"vmuludq", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpmuludq", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpmuludq", _256|_66|_0f, {Yy, YVy, Xy}}, E(f5) -{"vmaddwd", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpmaddwd", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpmaddwd", _256|_66|_0f, {Yy, YVy, Xy}}, {"bzhi", _128|_0f38|W0, {Gd, RVd, Ed}}, {"bzhi", _128|_0f38|W1, {Gq, RVq, Eq}}, {"pdep", _128|_f2|_0f38|W0, {Gd, RVd, Ed}}, {"pdep", _128|_f2|_0f38|W1, {Gq, RVq, Eq}}, -{"pdep", _128|_f3|_0f38|W0, {Gd, RVd, Ed}}, -{"pdep", _128|_f3|_0f38|W1, {Gq, RVq, Eq}}, +{"pext", _128|_f3|_0f38|W0, {Gd, RVd, Ed}}, +{"pext", _128|_f3|_0f38|W1, {Gq, RVq, Eq}}, E(f6) {"vpsadbw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpsadbw", _256|_66|_0f, {Yy, YVy, Xy}}, {"mulx", _128|_f2|_0f38|W0, {Gd, RVd, Ed}}, {"mulx", _128|_f2|_0f38|W1, {Gq, RVq, Eq}}, E(f7) @@ -4322,18 +4420,25 @@ E(f7) {"shlx", _128|_f2|_0f38|W1, {Gq, RVq, Eq}}, E(f8) {"vpsubb", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpsubb", _256|_66|_0f, {Yy, YVy, Xy}}, E(f9) {"vpsubw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpsubw", _256|_66|_0f, {Yy, YVy, Xy}}, E(fa) {"vpsubd", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpsubd", _256|_66|_0f, {Yy, YVy, Xy}}, E(fb) {"vpsubq", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpsubq", _256|_66|_0f, {Yy, YVy, Xy}}, E(fc) {"vpaddb", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpaddb", _256|_66|_0f, {Yy, YVy, Xy}}, E(fd) {"vpaddw", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpaddw", _256|_66|_0f, {Yy, YVy, Xy}}, E(fe) {"vpaddd", _128|_66|_0f, {Vo, VVo, Wo}}, +{"vpaddd", _256|_66|_0f, {Yy, YVy, Xy}}, Elast x86opc_vex_insn x86_group_vex_insns[][8] = { From d716394a1b5429647144ac1a99da3332c6b31427 Mon Sep 17 00:00:00 2001 From: seppel Date: Tue, 17 Jan 2012 16:27:59 +0000 Subject: [PATCH 21/53] *** empty log message *** --- doc/ht.texi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/ht.texi b/doc/ht.texi index 0119889..009a15f 100644 --- a/doc/ht.texi +++ b/doc/ht.texi @@ -51,14 +51,14 @@ be registered in certain jurisdictions. @titlepage @title{HT Manual} -@subtitle{Edition 2.0.19, January 2010} +@subtitle{Edition 2.0.19, January 2012} @author{Stefan Weyergraf, Sebastian Biallas} @c The following two commands start the copyright page. @page @vskip 0pt plus 1filll -Copyright @copyright{} 1999-2010 The HT authors. @* +Copyright @copyright{} 1999-2012 The HT authors. @* @xref{Authors, The HT Authors, The HT Authors}, for a list of the copyright holders. From 04fe325c15781b4b414ac0d5b7fb07860941c81f Mon Sep 17 00:00:00 2001 From: seppel Date: Tue, 17 Jan 2012 17:49:32 +0000 Subject: [PATCH 22/53] *** empty log message *** --- cp-demangle.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/cp-demangle.c b/cp-demangle.c index 7e951cc..ac97375 100644 --- a/cp-demangle.c +++ b/cp-demangle.c @@ -124,8 +124,6 @@ extern char *alloca (); # endif /* alloca */ #endif /* HAVE_ALLOCA_H */ -#include "ansidecl.h" -#include "libiberty.h" #include "demangle.h" #include "cp-demangle.h" From 9162bb2bd12cb7796e48f3344ecf1043ece6d318 Mon Sep 17 00:00:00 2001 From: seppel Date: Tue, 17 Jan 2012 17:57:14 +0000 Subject: [PATCH 23/53] *** empty log message *** --- configure.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.in b/configure.in index 3c45bee..18d82ae 100644 --- a/configure.in +++ b/configure.in @@ -17,7 +17,7 @@ AC_ARG_ENABLE(profiling, if test "x$enable_maintainermode" = "xno"; then if test "x$enable_release" = "xyes"; then - FLAGS_ALL="-O3 -fomit-frame-pointer -Wall -fsigned-char" + FLAGS_ALL="-march=native -O3 -fomit-frame-pointer -Wall -fsigned-char" else FLAGS_ALL="-ggdb -g3 -O0 -Wall -fsigned-char" fi From 1cf0e92f75c1ac475586b86f052bb91854bee46f Mon Sep 17 00:00:00 2001 From: seppel Date: Wed, 18 Jan 2012 07:29:22 +0000 Subject: [PATCH 24/53] *** empty log message *** --- configure.in | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/configure.in b/configure.in index 18d82ae..671c8f9 100644 --- a/configure.in +++ b/configure.in @@ -17,7 +17,7 @@ AC_ARG_ENABLE(profiling, if test "x$enable_maintainermode" = "xno"; then if test "x$enable_release" = "xyes"; then - FLAGS_ALL="-march=native -O3 -fomit-frame-pointer -Wall -fsigned-char" + FLAGS_ALL="-O3 -fomit-frame-pointer -Wall -fsigned-char" else FLAGS_ALL="-ggdb -g3 -O0 -Wall -fsigned-char" fi @@ -111,6 +111,19 @@ if test "x$AR" = "x"; then AC_MSG_ERROR([*** 'ar' and 'gar' missing, please install one of them or fix your \$PATH ***]) fi +if test "x$enable_maintainermode" = "xno"; then +if test "${GXX}" = yes; then + gxx_version=`${CXX} -v 2>&1 | grep "^.*g.. version" | \\ + sed -e 's/^.*g.. version *//'` + case ${gxx_version} in + 1.*|2.*|3.*|4.0|4.1|4.2|4.3) + ;; + *) + FLAGS_ALL="$FLAGS_ALL -march=native" + esac +fi +fi + dnl Checks for libraries. minilzo_enabled=no From 263590651f7e7a5671ddc90359b0bd42553bac35 Mon Sep 17 00:00:00 2001 From: seppel Date: Wed, 18 Jan 2012 08:53:39 +0000 Subject: [PATCH 25/53] *** empty log message *** --- process.cc | 59 ------------------------------------------------------ process.h | 31 ---------------------------- 2 files changed, 90 deletions(-) delete mode 100644 process.cc delete mode 100644 process.h diff --git a/process.cc b/process.cc deleted file mode 100644 index cc8cc88..0000000 --- a/process.cc +++ /dev/null @@ -1,59 +0,0 @@ -/* - * HT Editor - * process.cc - * - * Copyright (C) 1999-2002 Stefan Weyergraf - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "process.h" -#include "htctrl.h" -#include "htdialog.h" -#include "htiobox.h" -#include "keyb.h" - -bool execute_process(process_func pp, Object *context) -{ - Bounds b; - get_std_progress_indicator_metrics(&b); - - ht_progress_indicator pi; - pi.init(&b, "ESC to cancel"); - - bool cancelled=false; - bool p=true; - - while (p) { - p = pp(context, pi.text); - if (keyb_keypressed()) { - if (keyb_getkey() == K_Escape) { - cancelled = true; - break; - } - } - pi.sendmsg(msg_draw, 0); - screen->show(); - } - - pi.done(); - - return !cancelled; -} - -void execute_process_bg(process_func pp, Object *context) -{ - /* FIXME: nyi */ -} - diff --git a/process.h b/process.h deleted file mode 100644 index b795713..0000000 --- a/process.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * HT Editor - * process.h - * - * Copyright (C) 1999-2002 Stefan Weyergraf - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef __PROCESS_H__ -#define __PROCESS_H__ - -#include "data.h" -#include "htobj.h" - -typedef bool (*process_func)(Object *context, ht_text *progress_indicator); - -bool execute_process(process_func pp, Object *context); - -#endif /* __PROCESS_H__ */ From e457e8d04126c00d36f570917360f803c7d09614 Mon Sep 17 00:00:00 2001 From: seppel Date: Wed, 18 Jan 2012 15:09:10 +0000 Subject: [PATCH 26/53] *** empty log message *** --- io/win32/sysfile.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/io/win32/sysfile.cc b/io/win32/sysfile.cc index 79985ef..ab576bd 100644 --- a/io/win32/sysfile.cc +++ b/io/win32/sysfile.cc @@ -77,8 +77,9 @@ int sys_canonicalize(char **result, const char *filename) if (res >= maxlen) { *result = (char*)realloc(*result, res); maxlen = res+1; + } else { + return 0; } - return 0; } return ENOENT; } From e43db1bb909960a2d1d3a548577ba6bb33404667 Mon Sep 17 00:00:00 2001 From: seppel Date: Thu, 19 Jan 2012 08:02:26 +0000 Subject: [PATCH 27/53] *** empty log message *** --- configure.in | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/configure.in b/configure.in index 671c8f9..acc717e 100644 --- a/configure.in +++ b/configure.in @@ -69,6 +69,7 @@ cygwin*) mingw32*) IO_DIR=win32 echo "*** MINGW32, building native Win32 version" 1>&2 + HT_LDFLAGS="$HT_LDFLAGS -static-libgcc -static-libstdc++" NEED_CURSES=0 HAVE_PIPE=1 ;; @@ -119,7 +120,8 @@ if test "${GXX}" = yes; then 1.*|2.*|3.*|4.0|4.1|4.2|4.3) ;; *) - FLAGS_ALL="$FLAGS_ALL -march=native" + FLAGS_ALL="$FLAGS_ALL -march=native" + ;; esac fi fi From f1ccfd39416cc256de8bad3680f15c6063d821a2 Mon Sep 17 00:00:00 2001 From: seppel Date: Wed, 8 Feb 2012 14:14:27 +0000 Subject: [PATCH 28/53] *** empty log message *** --- analyser/macho_analy.cc | 8 +++++++- asm/x86asm.cc | 10 ++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/analyser/macho_analy.cc b/analyser/macho_analy.cc index ed0175c..aadc89a 100644 --- a/analyser/macho_analy.cc +++ b/analyser/macho_analy.cc @@ -297,11 +297,17 @@ Address *MachoAnalyser::createAddress64(uint64 addr) Assembler *MachoAnalyser::createAssembler() { switch (macho_shared->header.cputype) { - case MACHO_CPU_TYPE_I386: + case MACHO_CPU_TYPE_I386: { Assembler *a = new x86asm(X86_OPSIZE32, X86_ADDRSIZE32); a->init(); return a; } + case MACHO_CPU_TYPE_X86_64: { + Assembler *a = new x86_64asm(); + a->init(); + return a; + } + } return NULL; } diff --git a/asm/x86asm.cc b/asm/x86asm.cc index 728361d..bf54baf 100644 --- a/asm/x86asm.cc +++ b/asm/x86asm.cc @@ -834,11 +834,13 @@ bool x86asm::encode_modrm(x86_insn_op *op, char size, bool allow_reg, bool allow if (!allow_reg) return false; emitmodrm_mod(3); emitmodrm_rm(op->xmm); + if (op->xmm > 7) rexprefix |= rexb; break; case X86_OPTYPE_YMM: if (!allow_reg) return false; emitmodrm_mod(3); emitmodrm_rm(op->ymm); + if (op->ymm > 7) rexprefix |= rexb; break; default: return false; @@ -1076,7 +1078,8 @@ bool x86asm::encode_op(x86_insn_op *op, x86opc_insn_op *xop, int *esize, int eop } break; case TYPE_W: - /* ModR/M (XMM reg or memory) */ + case TYPE_X: + /* ModR/M (XMM/YMM reg or memory) */ if (!encode_modrm(op, xop->size, true, true, eopsize, eaddrsize)) return false; //XXX psize = esizeop(xop->size, eopsize); //XXX break; @@ -1103,11 +1106,6 @@ bool x86asm::encode_op(x86_insn_op *op, x86opc_insn_op *xop, int *esize, int eop emitmodrm_rm(op->ymm); if (op->ymm > 7) rexprefix |= rexb; break; - case TYPE_X: - /* ModR/M (YMM reg or memory) */ - if (!encode_modrm(op, xop->size, true, true, eopsize, eaddrsize)) return false; //XXX - psize = esizeop(xop->size, eopsize); //XXX - break; } if (!psize) { // set_error_msg(X86ASM_ERRMSG_INTERNAL"FIXME: size ??? %s, %d\n", __FILE__, __LINE__); From a43ce08e3f9b5906cb74be23acd935bbbc70646b Mon Sep 17 00:00:00 2001 From: seppel Date: Fri, 10 Feb 2012 16:22:42 +0000 Subject: [PATCH 29/53] *** empty log message *** --- configure.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/configure.in b/configure.in index acc717e..394a2cc 100644 --- a/configure.in +++ b/configure.in @@ -120,7 +120,8 @@ if test "${GXX}" = yes; then 1.*|2.*|3.*|4.0|4.1|4.2|4.3) ;; *) - FLAGS_ALL="$FLAGS_ALL -march=native" + CXXFLAGS="$CXXFLAGS -march=native" + CFLAGS="$CFLAGS -march=native" ;; esac fi From fbba02e7414d48db284291bd934b14c203f8757f Mon Sep 17 00:00:00 2001 From: seppel Date: Sun, 19 Feb 2012 14:07:02 +0000 Subject: [PATCH 30/53] *** empty log message *** --- doc/ht.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/ht.texi b/doc/ht.texi index 009a15f..ee8164d 100644 --- a/doc/ht.texi +++ b/doc/ht.texi @@ -532,7 +532,7 @@ Searching for patterns: Enter @code{readbyte(o) == readbyte(o+1)}@* This will search for two equal bytes ("AA", "55", "!!", etc.). @item -Enter @code{(readbyte(o) == readbyte(o+1)+1) && ((readbyte(o)==readbyte(o+2)+2)}@* +Enter @code{(readbyte(o) == readbyte(o+1)-1) && (readbyte(o)==readbyte(o+2)-2)}@* This will search for three ascending bytes ("ABC", "123", etc). @end enumerate From f706aaf3e0de7440e377ac6d22f4df910efe8fd1 Mon Sep 17 00:00:00 2001 From: seppel Date: Sun, 19 Feb 2012 14:45:45 +0000 Subject: [PATCH 31/53] *** empty log message *** --- asm/x86asm.cc | 6 +++--- asm/x86opc.cc | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/asm/x86asm.cc b/asm/x86asm.cc index bf54baf..a36f630 100644 --- a/asm/x86asm.cc +++ b/asm/x86asm.cc @@ -1695,7 +1695,7 @@ void x86asm::match_fopcodes(x86asm_insn *insn) int eaddrsize = addrsize; for (int k=0; k < 2; k++) { if (match_allops(insn, x86_modfloat_group_insns[i][j].op, 4, opsize, eaddrsize)) { - if (encode_insn(insn, &x86_modfloat_group_insns[i][j], j<<3, -1, X86ASM_PREFIX_D8+i, opsize, eaddrsize)) { + if (encode_insn(insn, &x86_modfloat_group_insns[i][j], -1, j, X86ASM_PREFIX_D8+i, opsize, eaddrsize)) { pushcode(); newcode(); } @@ -1717,7 +1717,7 @@ void x86asm::match_fopcodes(x86asm_insn *insn) namefound |= n; if (n != MATCHOPNAME_NOMATCH) { if (match_allops(insn, x86_float_group_insns[i][j].insn.op, 4, opsize, addrsize)) { - if (encode_insn(insn, &x86_float_group_insns[i][j].insn, 0xc0 | j<<3, -1, X86ASM_PREFIX_D8+i, opsize, addrsize)) { + if (encode_insn(insn, &x86_float_group_insns[i][j].insn, -1, 0x800 | j, X86ASM_PREFIX_D8+i, opsize, addrsize)) { pushcode(); newcode(); } @@ -1733,7 +1733,7 @@ void x86asm::match_fopcodes(x86asm_insn *insn) int eaddrsize = addrsize; for (int l=0; l < 2; l++) { if (match_allops(insn, group[k].op, 4, opsize, eaddrsize)) { - if (encode_insn(insn, &group[k], 0xc0 | j<<3 | k, -1, X86ASM_PREFIX_D8+i, opsize, eaddrsize)) { + if (encode_insn(insn, &group[k], -1, 0x800 | k<<3 | j, X86ASM_PREFIX_D8+i, opsize, eaddrsize)) { pushcode(); newcode(); } diff --git a/asm/x86opc.cc b/asm/x86opc.cc index c97e2bb..7f916c9 100644 --- a/asm/x86opc.cc +++ b/asm/x86opc.cc @@ -2689,7 +2689,7 @@ x86opc_insn x86_group_insns[][8] = { {0}, {0}, {0}, -{0}, +{"xabort", {Ib}}, }, /* 7 - GROUP_C7 */ { @@ -2700,7 +2700,7 @@ x86opc_insn x86_group_insns[][8] = { {0}, {0}, {0}, -{0}, +{"xbegin", {Jv}}, }, /* 8 - GROUP_D0 */ { @@ -2958,8 +2958,8 @@ x86opc_insn x86_special_group_insns[X86_SPECIAL_GROUPS][9] = { {0}, {0}, {"vmfunc"}, -{0}, -{0}, +{"xend"}, +{"xtest"}, {0}, // with mod!=11: {"lgdt", {M}}, From 03a86faa9604adf537b0a72ecc0a15c60783a156 Mon Sep 17 00:00:00 2001 From: seppel Date: Sun, 19 Feb 2012 20:11:07 +0000 Subject: [PATCH 32/53] *** empty log message *** --- configure.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.in b/configure.in index 394a2cc..feef56c 100644 --- a/configure.in +++ b/configure.in @@ -120,8 +120,8 @@ if test "${GXX}" = yes; then 1.*|2.*|3.*|4.0|4.1|4.2|4.3) ;; *) - CXXFLAGS="$CXXFLAGS -march=native" - CFLAGS="$CFLAGS -march=native" +dnl CXXFLAGS="$CXXFLAGS -march=native" +dnl CFLAGS="$CFLAGS -march=native" ;; esac fi From d255c45a001cd1f98c116b3335fac4f8a4efaa71 Mon Sep 17 00:00:00 2001 From: seppel Date: Tue, 28 Feb 2012 21:48:29 +0000 Subject: [PATCH 33/53] *** empty log message *** --- ChangeLog | 3 +++ configure.in | 2 +- doc/ht.texi | 2 +- htelf.cc | 2 ++ htinfo.h | 2 +- 5 files changed, 8 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index ed8ff99..ef7752e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,9 @@ HT ChangeLog ============== +version 2.0.20: + - Fixed loading of 32 bit ELFs (Thanks Oleg) + version 2.0.19: - [x86] fixed a lot of small bugs - fixed a crash with the "follow" function on diff --git a/configure.in b/configure.in index feef56c..2184d55 100644 --- a/configure.in +++ b/configure.in @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. -AC_INIT(ht,[2.0.19],[https://sourceforge.net/tracker/?group_id=1066]) +AC_INIT(ht,[2.0.20],[https://sourceforge.net/tracker/?group_id=1066]) AC_PREREQ(2.59) dnl Check the system. diff --git a/doc/ht.texi b/doc/ht.texi index ee8164d..86cd318 100644 --- a/doc/ht.texi +++ b/doc/ht.texi @@ -51,7 +51,7 @@ be registered in certain jurisdictions. @titlepage @title{HT Manual} -@subtitle{Edition 2.0.19, January 2012} +@subtitle{Edition 2.0.20, January 2012} @author{Stefan Weyergraf, Sebastian Biallas} @c The following two commands start the copyright page. diff --git a/htelf.cc b/htelf.cc index a548344..946d23a 100644 --- a/htelf.cc +++ b/htelf.cc @@ -155,6 +155,8 @@ void ht_elf::init(Bounds *b, File *f, format_viewer_if **ifs, ht_format_group *f if (!elf_shared->sheaders.count) { elf_shared->sheaders.sheaders32 = NULL; } else { + elf_shared->sheaders.sheaders32 = + ht_malloc(elf_shared->sheaders.count * sizeof *elf_shared->sheaders.sheaders32); file->seek(header_ofs + elf_shared->header32.e_shoff); file->readx(elf_shared->sheaders.sheaders32, elf_shared->sheaders.count*sizeof *elf_shared->sheaders.sheaders32); for (uint i=0; i < elf_shared->sheaders.count; i++) { diff --git a/htinfo.h b/htinfo.h index e9039b2..742eddb 100644 --- a/htinfo.h +++ b/htinfo.h @@ -24,7 +24,7 @@ #define ht_url "http://hte.sourceforge.net" #define ht_name "ht" -#define ht_version "2.0.19" +#define ht_version "2.0.20" #define ht_author1 "Stefan Weyergraf" #define ht_copyright1 "(c) 1999-2004 "ht_author1 From 025ea19783811f70d7a22b39bbe6840d7648134a Mon Sep 17 00:00:00 2001 From: seppel Date: Sat, 3 Mar 2012 15:32:19 +0000 Subject: [PATCH 34/53] *** empty log message *** --- configure.in | 3 ++- io/posix/sysdisplay.cc | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/configure.in b/configure.in index 2184d55..bcc0da9 100644 --- a/configure.in +++ b/configure.in @@ -42,6 +42,7 @@ linux*) echo "*** LINUX, building POSIX version. we need (n)curses." 1>&2 NEED_CURSES=1 HAVE_PIPE=1 + HT_LIBS="$HT_LIBS -lm" FLAGS_ALL="$FLAGS_ALL -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" ;; *freebsd*) @@ -191,7 +192,7 @@ AC_CHECK_HEADERS([stdint.h]) dnl AC_CONFIG_HEADER(config.h) CURSES_LIB= if test "x$NEED_CURSES" = "x1"; then - AC_CHECK_HEADERS(ncurses.h, AC_DEFINE(CURSES_HDR, , [This system provides (n)curses.h]) CURSES_LIB=ncurses) + AC_CHECK_HEADERS(ncurses.h, AC_DEFINE(CURSES_HDR, , [This system provides (n)curses.h/wide]) CURSES_LIB=ncursesw) if test "x$CURSES_LIB" = "x"; then AC_CHECK_HEADERS(curses.h, AC_DEFINE(CURSES_HDR, , [This system provides (n)curses.h]) CURSES_LIB=curses) if test "x$CURSES_LIB" = "x"; then diff --git a/io/posix/sysdisplay.cc b/io/posix/sysdisplay.cc index 91a99ae..bd47bdb 100644 --- a/io/posix/sysdisplay.cc +++ b/io/posix/sysdisplay.cc @@ -301,7 +301,7 @@ void CursesSystemDisplay::term_on() setCursor(0, 0, CURSOR_OFF); -// ::setlocale(LC_ALL, ""); + ::setlocale(LC_ALL, ""); // terminal = ::newterm(NULL, stdout, stdin); win = ::initscr(); From e1426ec154e618727c4ab075e21906b9ef1c86a2 Mon Sep 17 00:00:00 2001 From: seppel Date: Sat, 3 Mar 2012 16:28:22 +0000 Subject: [PATCH 35/53] *** empty log message *** --- htsearch.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htsearch.cc b/htsearch.cc index fe035f0..85c832b 100644 --- a/htsearch.cc +++ b/htsearch.cc @@ -531,10 +531,10 @@ bool search_bin_process(Object *context, ht_text *progress_indicator) } ctx->o -= ctx->patlen-1; - int p = (int)(((double)(ctx->o - ctx->ofs))*100/ctx->len); + int p = (((double)(ctx->o - ctx->ofs))*100/ctx->len); char status[64]; - ht_snprintf(status, sizeof status, "%d %%", p); + ht_snprintf(status, sizeof status, "%d %% (%d MiB)", p, int ((unsigned long long)ctx->o >> 20)); progress_indicator->settext(status); return true; From a2b89e3bd7469965625699148a5d3571f94c822e Mon Sep 17 00:00:00 2001 From: seppel Date: Sat, 3 Mar 2012 17:29:21 +0000 Subject: [PATCH 36/53] *** empty log message *** --- ChangeLog | 2 ++ classview.cc | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index ef7752e..3771319 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,8 @@ version 2.0.20: - Fixed loading of 32 bit ELFs (Thanks Oleg) + - Use wide ncurses if necessars (Thanks Jan) + - Show search progress in MiB (Thanks Jan) version 2.0.19: - [x86] fixed a lot of small bugs diff --git a/classview.cc b/classview.cc index 1838a66..bf5d488 100644 --- a/classview.cc +++ b/classview.cc @@ -713,11 +713,20 @@ static format_viewer_if *htcls_ifs[] = { static ht_view *class_init(Bounds *b, File *file, ht_format_group *group) { u1 magic[4]; + u1 extra_magic[4]; - file->seek(0); - file->read(magic, 4); + try { + file->seek(0); + file->readx(magic, 4); + file->readx(extra_magic, 4); + } catch (...) { + return NULL; + } + // Mach-O binaries also use 0xcafebabe here. The second byte is the + // number of architectures; if there's more than 10 it's probably + // a Java class file instead. if (magic[0] == 0xca && magic[1] == 0xfe - && magic[2] == 0xba && magic[3] == 0xbe) { + && magic[2] == 0xba && magic[3] == 0xbe && extra_magic[3] > 10) { file->seek(0); void *shared_data = (void*)class_read(file); if (!shared_data) return NULL; From 40f00ecc3ae5c27dc5c920ca3d12047d6b9555ce Mon Sep 17 00:00:00 2001 From: seppel Date: Sat, 3 Mar 2012 18:02:07 +0000 Subject: [PATCH 37/53] *** empty log message *** --- configure.in | 2 +- doc/ht.texi | 7 ++++--- htinfo.h | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/configure.in b/configure.in index bcc0da9..a6352ca 100644 --- a/configure.in +++ b/configure.in @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. -AC_INIT(ht,[2.0.20],[https://sourceforge.net/tracker/?group_id=1066]) +AC_INIT(ht,[2.0.21],[https://sourceforge.net/tracker/?group_id=1066]) AC_PREREQ(2.59) dnl Check the system. diff --git a/doc/ht.texi b/doc/ht.texi index 86cd318..d99107a 100644 --- a/doc/ht.texi +++ b/doc/ht.texi @@ -51,7 +51,7 @@ be registered in certain jurisdictions. @titlepage @title{HT Manual} -@subtitle{Edition 2.0.20, January 2012} +@subtitle{Edition 2.0.21, March 2012} @author{Stefan Weyergraf, Sebastian Biallas} @c The following two commands start the copyright page. @@ -455,6 +455,9 @@ details (sorry but a detailed help would get outdated rather soon). The symbol _ always refers to the last result. +If you are in a hex buffer, the variable @code{first} contains the offset of the first byte and the variable +@code{last} contains the offset of the last byte. This is useful, for instace, if you want to jump to the last byte of a file. + When using @xref{Block operations}, or searching you have some context depending functions and symbols; see these sections for explanation. @@ -486,8 +489,6 @@ read a byte from offset @var{ofs}, returns a number read @var{size} bytes from offset @var{ofs}, returns a string @item i contains the iteration count/index starting with 0 -@item o -contains the current offset @end table @node Search and its different modes, , Features, Features diff --git a/htinfo.h b/htinfo.h index 742eddb..b3cff3e 100644 --- a/htinfo.h +++ b/htinfo.h @@ -24,7 +24,7 @@ #define ht_url "http://hte.sourceforge.net" #define ht_name "ht" -#define ht_version "2.0.20" +#define ht_version "2.0.21" #define ht_author1 "Stefan Weyergraf" #define ht_copyright1 "(c) 1999-2004 "ht_author1 From de210b64eb189183e66b44b9c5e0a3ba937e0d71 Mon Sep 17 00:00:00 2001 From: seppel Date: Sun, 4 Mar 2012 20:21:44 +0000 Subject: [PATCH 38/53] *** empty log message *** --- ChangeLog | 3 + analyser/analy.cc | 8 +- analyser/analy_x86.cc | 20 +-- asm/alphadis.cc | 4 +- httag.cc | 369 +++++++++++++++++++++--------------------- httag.h | 38 +++++ tools.h | 3 - 7 files changed, 246 insertions(+), 199 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3771319..c89a836 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,9 @@ HT ChangeLog ============== +version 2.0.20: + - Fixed usage of unaliged pointers (Thanks Jan) + version 2.0.20: - Fixed loading of 32 bit ELFs (Thanks Oleg) - Use wide ncurses if necessars (Thanks Jan) diff --git a/analyser/analy.cc b/analyser/analy.cc index ace2929..2ef4663 100644 --- a/analyser/analy.cc +++ b/analyser/analy.cc @@ -189,7 +189,7 @@ AddressFlat32 *AddressFlat32::clone() const void AddressFlat32::getFromArray(const byte *array) { - UNALIGNED_MOVE(addr, *(uint32*)array); + memcpy(&addr, array, sizeof(addr)); } void AddressFlat32::getFromCPUAddress(CPU_ADDR *ca) @@ -224,7 +224,7 @@ int AddressFlat32::parseString(const char *s, int length, Analyser *a) void AddressFlat32::putIntoArray(byte *array) const { - UNALIGNED_MOVE(*(uint32*)array, addr); + memcpy(array, &addr, sizeof(addr)); } void AddressFlat32::putIntoCPUAddress(CPU_ADDR *ca) const @@ -318,7 +318,7 @@ AddressFlat64 *AddressFlat64::clone() const void AddressFlat64::getFromArray(const byte *array) { - UNALIGNED_MOVE(addr, *(uint64*)array); + memcpy(&addr, array, sizeof(addr)); } void AddressFlat64::getFromCPUAddress(CPU_ADDR *ca) @@ -349,7 +349,7 @@ int AddressFlat64::parseString(const char *s, int length, Analyser *a) void AddressFlat64::putIntoArray(byte *array) const { - UNALIGNED_MOVE(*(uint64*)array, addr); + memcpy(array, &addr, sizeof(addr)); } void AddressFlat64::putIntoCPUAddress(CPU_ADDR *ca) const diff --git a/analyser/analy_x86.cc b/analyser/analy_x86.cc index c6942d3..31ca951 100644 --- a/analyser/analy_x86.cc +++ b/analyser/analy_x86.cc @@ -78,7 +78,7 @@ AddressX86Flat32 *AddressX86Flat32::clone() const void AddressX86Flat32::getFromArray(const byte *array) { - UNALIGNED_MOVE(addr, *(uint32*)array); + memcpy(&addr, array, sizeof(addr)); } void AddressX86Flat32::getFromCPUAddress(CPU_ADDR *ca) @@ -113,7 +113,7 @@ int AddressX86Flat32::parseString(const char *s, int length, Analyser *a) void AddressX86Flat32::putIntoArray(byte *array) const { - UNALIGNED_MOVE(*(uint32*)array, addr); + memcpy(array, &addr, sizeof(addr)); } void AddressX86Flat32::putIntoCPUAddress(CPU_ADDR *ca) const @@ -217,8 +217,8 @@ AddressX86_1632 *AddressX86_1632::clone() const void AddressX86_1632::getFromArray(const byte *array) { - UNALIGNED_MOVE(addr, *(uint32*)array); - UNALIGNED_MOVE(seg, *(uint16*)(array+sizeof addr)); + memcpy(&addr, array, sizeof(addr)); + memcpy(&seg, array + sizeof(addr), sizeof(seg)); } void AddressX86_1632::getFromCPUAddress(CPU_ADDR *ca) @@ -250,8 +250,8 @@ int AddressX86_1632::parseString(const char *s, int length, Analyser *a) void AddressX86_1632::putIntoArray(byte *array) const { - UNALIGNED_MOVE(*(uint32*)array, addr); - UNALIGNED_MOVE(*(uint16*)(array+sizeof addr), seg); + memcpy(array, &addr, sizeof(addr)); + memcpy(array + sizeof(addr), &seg, sizeof(seg)); } void AddressX86_1632::putIntoCPUAddress(CPU_ADDR *ca) const @@ -360,8 +360,8 @@ AddressX86_1616 *AddressX86_1616::clone() const void AddressX86_1616::getFromArray(const byte *array) { - UNALIGNED_MOVE(addr, *(uint16*)array); - UNALIGNED_MOVE(seg, *(uint16*)(array+sizeof addr)); + memcpy(&addr, array, sizeof(addr)); + memcpy(&seg, array + sizeof(addr), sizeof(seg)); } bool AddressX86_1616::getFromUInt64(uint64 u) @@ -393,8 +393,8 @@ int AddressX86_1616::parseString(const char *s, int length, Analyser *a) void AddressX86_1616::putIntoArray(byte *array) const { - UNALIGNED_MOVE(*(uint16*)array, addr); - UNALIGNED_MOVE(*(uint16*)(array+sizeof seg), seg); + memcpy(array, &addr, sizeof(addr)); + memcpy(array + sizeof(addr), &seg, sizeof(seg)); } void AddressX86_1616::putIntoCPUAddress(CPU_ADDR *ca) const diff --git a/asm/alphadis.cc b/asm/alphadis.cc index de264c5..bfbf887 100644 --- a/asm/alphadis.cc +++ b/asm/alphadis.cc @@ -80,8 +80,8 @@ dis_insn *Alphadis::decode(byte *code, int maxlen, CPU_ADDR addr) insn.valid = false; insn.size = maxlen; insn.table = 0; - // FIXME: this reads to much bytes! - UNALIGNED_MOVE(insn.data, *(uint32 *)code); + // FIXME: this reads too many bytes! + memcpy(&insn.data, code, sizeof(insn.data)); } else { insn.valid = true; insn.size = 4; diff --git a/httag.cc b/httag.cc index 7c5ce68..32ec4d5 100644 --- a/httag.cc +++ b/httag.cc @@ -71,16 +71,16 @@ TAGSTRING *tag_make_ref_len(TAGSTRING *buf, int maxlen, uint32 id128_1, uint32 i if (maxlen <= (signed)sizeof (ht_tag_sel)+strlen) { strlen = maxlen - sizeof (ht_tag_sel) - 1; } - ht_tag_sel *tag=(ht_tag_sel*)buf; - tag->escape = '\e'; - tag->magic = HT_TAG_SEL; - UNALIGNED_MOVE(tag->id128_1, id128_1); - UNALIGNED_MOVE(tag->id128_2, id128_2); - UNALIGNED_MOVE(tag->id128_3, id128_3); - UNALIGNED_MOVE(tag->id128_4, id128_4); - UNALIGNED_MOVE(tag->strlen, strlen); - memcpy(buf+sizeof (ht_tag_sel), string, strlen); - return buf+sizeof (ht_tag_sel)+strlen; + ht_tag_sel tag; + tag.escape = '\e'; + tag.magic = HT_TAG_SEL; + tag.id128_1 = id128_1; + tag.id128_2 = id128_2; + tag.id128_3 = id128_3; + tag.id128_4 = id128_4; + tag.strlen = strlen; + tag.flush(buf); + return buf + sizeof(tag) + strlen; } TAGSTRING *tag_make_ref(TAGSTRING *buf, int maxlen, uint32 id128_1, uint32 id128_2, uint32 id128_3, uint32 id128_4, const char *string) @@ -91,58 +91,63 @@ TAGSTRING *tag_make_ref(TAGSTRING *buf, int maxlen, uint32 id128_1, uint32 id128 TAGSTRING *tag_make_flags(TAGSTRING *buf, int maxlen, uint32 id, FileOfs ofs) { if (maxlen <= (signed)sizeof (ht_tag_flags)) return tag_error(buf, maxlen); - ht_tag_flags *tag = (ht_tag_flags*)buf; - tag->escape = '\e'; - tag->magic = HT_TAG_FLAGS; - UNALIGNED_MOVE(tag->offset, ofs); - UNALIGNED_MOVE(tag->id, id); - return buf + sizeof (ht_tag_flags); + ht_tag_flags tag; + tag.escape = '\e'; + tag.magic = HT_TAG_FLAGS; + tag.offset = ofs; + tag.id = id; + tag.flush(buf); + return buf + sizeof(tag); } TAGSTRING *tag_make_group(TAGSTRING *buf, int maxlen) { if (maxlen <= (signed)sizeof (ht_tag_group)) return tag_error(buf, maxlen); - ht_tag_group *tag = (ht_tag_group*)buf; - tag->escape = '\e'; - tag->magic = HT_TAG_GROUP; - return buf + sizeof (ht_tag_group); + ht_tag_group tag; + tag.escape = '\e'; + tag.magic = HT_TAG_GROUP; + tag.flush(buf); + return buf + sizeof(tag); } TAGSTRING *tag_make_color(TAGSTRING *buf, int maxlen, uint32 color) { if (maxlen <= (signed)sizeof (ht_tag_color)) return tag_error(buf, maxlen); - ht_tag_color *tag = (ht_tag_color*)buf; - tag->escape = '\e'; - tag->magic = HT_TAG_COLOR; - UNALIGNED_MOVE(tag->color, color); - return buf + sizeof (ht_tag_color); + ht_tag_color tag; + tag.escape = '\e'; + tag.magic = HT_TAG_COLOR; + tag.color = color; + tag.flush(buf); + return buf + sizeof(tag); } TAGSTRING *tag_make_default_color(TAGSTRING *buf, int maxlen) { if (maxlen <= (signed)sizeof (ht_tag_color)) return tag_error(buf, maxlen); - ht_tag_color *tag = (ht_tag_color*)buf; - tag->escape = '\e'; - tag->magic = HT_TAG_COLOR; - UNALIGNED_MOVE_CONST(tag->color, 0xffffffff, uint32); - return buf + sizeof (ht_tag_color); + ht_tag_color tag; + tag.escape = '\e'; + tag.magic = HT_TAG_COLOR; + tag.color = 0xffffffffU; + tag.flush(buf); + return buf + sizeof(tag); } TAGSTRING *tag_make_edit_byte(TAGSTRING *buf, int maxlen, FileOfs ofs) { if (maxlen <= (signed)sizeof (ht_tag_edit_byte)) return tag_error(buf, maxlen); - ht_tag_edit_byte *tag = (ht_tag_edit_byte*)buf; - tag->escape = '\e'; - tag->magic = HT_TAG_EDIT_BYTE; - UNALIGNED_MOVE(tag->offset, ofs); - return buf + sizeof (ht_tag_edit_byte); + ht_tag_edit_byte tag; + tag.escape = '\e'; + tag.magic = HT_TAG_EDIT_BYTE; + tag.offset = ofs; + tag.flush(buf); + return buf + sizeof(tag); } TAGSTRING *tag_make_edit_word(TAGSTRING *buf, int maxlen, FileOfs ofs, tag_endian e) { if (maxlen <= (signed)sizeof (ht_tag_edit_word_generic)) return tag_error(buf, maxlen); - ht_tag_edit_word_generic *tag = (ht_tag_edit_word_generic*)buf; - tag->escape = '\e'; + ht_tag_edit_word_generic tag; + tag.escape = '\e'; byte m = 0xff; switch (e) { case tag_endian_big: @@ -155,16 +160,17 @@ TAGSTRING *tag_make_edit_word(TAGSTRING *buf, int maxlen, FileOfs ofs, tag_endia m = HT_TAG_EDIT_WORD_VE; break; } - tag->magic = m; - UNALIGNED_MOVE(tag->offset, ofs); - return buf + sizeof (ht_tag_edit_word_generic); + tag.magic = m; + tag.offset = ofs; + tag.flush(buf); + return buf + sizeof(tag); } TAGSTRING *tag_make_edit_dword(TAGSTRING *buf, int maxlen, FileOfs ofs, tag_endian e) { if (maxlen <= (signed)sizeof (ht_tag_edit_dword_generic)) return tag_error(buf, maxlen); - ht_tag_edit_dword_generic *tag = (ht_tag_edit_dword_generic*)buf; - tag->escape = '\e'; + ht_tag_edit_dword_generic tag; + tag.escape = '\e'; byte m = 0xff; switch (e) { case tag_endian_big: @@ -177,16 +183,17 @@ TAGSTRING *tag_make_edit_dword(TAGSTRING *buf, int maxlen, FileOfs ofs, tag_endi m = HT_TAG_EDIT_DWORD_VE; break; } - tag->magic = m; - UNALIGNED_MOVE(tag->offset, ofs); - return buf + sizeof (ht_tag_edit_dword_generic); + tag.magic = m; + tag.offset = ofs; + tag.flush(buf); + return buf + sizeof(tag); } TAGSTRING *tag_make_edit_qword(TAGSTRING *buf, int maxlen, FileOfs ofs, tag_endian e) { if (maxlen <= (signed)sizeof (ht_tag_edit_qword_generic)) return tag_error(buf, maxlen); - ht_tag_edit_qword_generic *tag = (ht_tag_edit_qword_generic*)buf; - tag->escape = '\e'; + ht_tag_edit_qword_generic tag; + tag.escape = '\e'; byte m = 0xff; switch (e) { case tag_endian_big: @@ -199,17 +206,18 @@ TAGSTRING *tag_make_edit_qword(TAGSTRING *buf, int maxlen, FileOfs ofs, tag_endi m = HT_TAG_EDIT_QWORD_VE; break; } - tag->magic = m; - UNALIGNED_MOVE(tag->offset, ofs); - return buf + sizeof (ht_tag_edit_qword_generic); + tag.magic = m; + tag.offset = ofs; + tag.flush(buf); + return buf + sizeof(tag); } TAGSTRING *tag_make_edit_time(TAGSTRING *buf, int maxlen, FileOfs ofs, tag_endian e) { if (maxlen <= (signed)sizeof (ht_tag_edit_time)) return tag_error(buf, maxlen); - ht_tag_edit_time *tag = (ht_tag_edit_time*)buf; - tag->escape = '\e'; - byte m = 0xff; + ht_tag_edit_time tag; + tag.escape = '\e'; + byte m = 0xff; switch (e) { case tag_endian_big: m = HT_TAG_EDIT_TIME_BE; @@ -221,59 +229,64 @@ TAGSTRING *tag_make_edit_time(TAGSTRING *buf, int maxlen, FileOfs ofs, tag_endia m = HT_TAG_EDIT_TIME_VE; break; } - tag->magic = m; - UNALIGNED_MOVE(tag->offset, ofs); - return buf + sizeof (ht_tag_edit_time); + tag.magic = m; + tag.offset = ofs; + tag.flush(buf); + return buf + sizeof(tag); } TAGSTRING *tag_make_edit_char(TAGSTRING *buf, int maxlen, FileOfs ofs) { if (maxlen <= (signed)sizeof (ht_tag_edit_char)) return tag_error(buf, maxlen); - ht_tag_edit_char *tag = (ht_tag_edit_char*)buf; - tag->escape = '\e'; - tag->magic = HT_TAG_EDIT_CHAR; - UNALIGNED_MOVE(tag->offset, ofs); - return buf + sizeof (ht_tag_edit_char); + ht_tag_edit_char tag; + tag.escape = '\e'; + tag.magic = HT_TAG_EDIT_CHAR; + tag.offset = ofs; + tag.flush(buf); + return buf + sizeof(tag); } TAGSTRING *tag_make_edit_bit(TAGSTRING *buf, int maxlen, FileOfs ofs, int bitidx) { if (maxlen <= (signed)sizeof (ht_tag_edit_bit)) return tag_error(buf, maxlen); - ht_tag_edit_bit *tag = (ht_tag_edit_bit*)buf; - tag->escape = '\e'; - tag->magic = HT_TAG_EDIT_BIT; - UNALIGNED_MOVE(tag->offset, ofs); - UNALIGNED_MOVE(tag->bitidx, bitidx); - return buf+sizeof (ht_tag_edit_bit); + ht_tag_edit_bit tag; + tag.escape = '\e'; + tag.magic = HT_TAG_EDIT_BIT; + tag.offset = ofs; + tag.bitidx = bitidx; + tag.flush(buf); + return buf + sizeof(tag); } TAGSTRING *tag_make_edit_selvis(TAGSTRING *buf, int maxlen, FileOfs offset, char ch) { if (maxlen <= (signed)sizeof (ht_tag_edit_selvis)) return tag_error(buf, maxlen); - ht_tag_edit_selvis *tag=(ht_tag_edit_selvis*)buf; - tag->escape = '\e'; - tag->magic = HT_TAG_EDIT_SELVIS; - UNALIGNED_MOVE(tag->offset, offset); - tag->ch = ch; - return buf + sizeof (ht_tag_edit_selvis); + ht_tag_edit_selvis tag; + tag.escape = '\e'; + tag.magic = HT_TAG_EDIT_SELVIS; + tag.offset = offset; + tag.ch = ch; + tag.flush(buf); + return buf + sizeof(tag); } TAGSTRING *tag_make_desc_byte(TAGSTRING *buf, int maxlen, FileOfs ofs32, uint32 id32) { if (maxlen <= (signed)sizeof (ht_tag_desc_byte)) return tag_error(buf, maxlen); - ht_tag_desc_byte *tag = (ht_tag_desc_byte*)buf; - tag->escape = '\e'; - tag->magic = HT_TAG_DESC_BYTE; - UNALIGNED_MOVE(tag->offset, ofs32); - UNALIGNED_MOVE(tag->id, id32); - return buf + sizeof (ht_tag_desc_byte); + ht_tag_desc_byte tag; + tag.escape = '\e'; + tag.magic = HT_TAG_DESC_BYTE; + tag.offset = ofs32; + tag.id = id32; + tag.flush(buf); + return buf + sizeof(tag); } TAGSTRING *tag_make_desc_word(TAGSTRING *buf, int maxlen, FileOfs ofs32, uint32 id32, tag_endian e) { if (maxlen <= (signed)sizeof (ht_tag_desc_word_generic)) return tag_error(buf, maxlen); - ht_tag_desc_word_generic *tag = (ht_tag_desc_word_generic*)buf; - tag->escape = '\e'; + ht_tag_desc_word_generic tag; + tag.escape = '\e'; byte m = 0xff; switch (e) { case tag_endian_big: @@ -286,17 +299,18 @@ TAGSTRING *tag_make_desc_word(TAGSTRING *buf, int maxlen, FileOfs ofs32, uint32 m = HT_TAG_DESC_WORD_VE; break; } - tag->magic = m; - UNALIGNED_MOVE(tag->offset, ofs32); - UNALIGNED_MOVE(tag->id, id32); - return buf + sizeof (ht_tag_desc_word_generic); + tag.magic = m; + tag.offset = ofs32; + tag.id = id32; + tag.flush(buf); + return buf + sizeof(tag); } TAGSTRING *tag_make_desc_dword(TAGSTRING *buf, int maxlen, FileOfs ofs32, uint32 id32, tag_endian e) { if (maxlen <= (signed)sizeof (ht_tag_desc_dword_generic)) return tag_error(buf, maxlen); - ht_tag_desc_dword_generic *tag = (ht_tag_desc_dword_generic*)buf; - tag->escape = '\e'; + ht_tag_desc_dword_generic tag; + tag.escape = '\e'; byte m = 0xff; switch (e) { case tag_endian_big: @@ -309,17 +323,18 @@ TAGSTRING *tag_make_desc_dword(TAGSTRING *buf, int maxlen, FileOfs ofs32, uint32 m = HT_TAG_DESC_DWORD_VE; break; } - tag->magic = m; - UNALIGNED_MOVE(tag->offset, ofs32); - UNALIGNED_MOVE(tag->id, id32); - return buf + sizeof (ht_tag_desc_dword_generic); + tag.magic = m; + tag.offset = ofs32; + tag.id = id32; + tag.flush(buf); + return buf + sizeof(tag); } TAGSTRING *tag_make_desc_qword(TAGSTRING *buf, int maxlen, FileOfs ofs32, uint32 id32, tag_endian e) { if (maxlen <= (signed)sizeof (ht_tag_desc_qword_generic)) return tag_error(buf, maxlen); - ht_tag_desc_qword_generic *tag = (ht_tag_desc_qword_generic*)buf; - tag->escape = '\e'; + ht_tag_desc_qword_generic tag; + tag.escape = '\e'; byte m = 0xff; switch (e) { case tag_endian_big: @@ -332,10 +347,11 @@ TAGSTRING *tag_make_desc_qword(TAGSTRING *buf, int maxlen, FileOfs ofs32, uint32 m = HT_TAG_DESC_QWORD_VE; break; } - tag->magic = m; - UNALIGNED_MOVE(tag->offset, ofs32); - UNALIGNED_MOVE(tag->id, id32); - return buf + sizeof (ht_tag_desc_qword_generic); + tag.magic = m; + tag.offset = ofs32; + tag.id = id32; + tag.flush(buf); + return buf + sizeof(tag); } /**/ @@ -757,73 +773,47 @@ int tag_get_size(const TAGSTRING *tagstring) FileOfs tag_get_offset(const TAGSTRING *tagstring) { - FileOfs f; switch (tagstring[1]) { - case HT_TAG_EDIT_BYTE: { - UNALIGNED_MOVE(f, ((ht_tag_edit_byte*)tagstring)->offset); - return f; - } + case HT_TAG_EDIT_BYTE: + return ht_tag_edit_byte(tagstring).offset; case HT_TAG_EDIT_WORD_LE: case HT_TAG_EDIT_WORD_BE: - case HT_TAG_EDIT_WORD_VE: { - UNALIGNED_MOVE(f, ((ht_tag_edit_word_generic*)tagstring)->offset); - return f; - } + case HT_TAG_EDIT_WORD_VE: + return ht_tag_edit_word_generic(tagstring).offset; case HT_TAG_EDIT_DWORD_LE: case HT_TAG_EDIT_DWORD_BE: - case HT_TAG_EDIT_DWORD_VE: { - UNALIGNED_MOVE(f, ((ht_tag_edit_dword_generic*)tagstring)->offset); - return f; - } + case HT_TAG_EDIT_DWORD_VE: + return ht_tag_edit_dword_generic(tagstring).offset; case HT_TAG_EDIT_QWORD_LE: case HT_TAG_EDIT_QWORD_BE: - case HT_TAG_EDIT_QWORD_VE: { - UNALIGNED_MOVE(f, ((ht_tag_edit_qword_generic*)tagstring)->offset); - return f; - } + case HT_TAG_EDIT_QWORD_VE: + return ht_tag_edit_qword_generic(tagstring).offset; case HT_TAG_EDIT_TIME_LE: case HT_TAG_EDIT_TIME_BE: - case HT_TAG_EDIT_TIME_VE: { - UNALIGNED_MOVE(f, ((ht_tag_edit_time*)tagstring)->offset); - return f; - } - case HT_TAG_EDIT_CHAR: { - UNALIGNED_MOVE(f, ((ht_tag_edit_char*)tagstring)->offset); - return f; - } - case HT_TAG_EDIT_BIT: { - UNALIGNED_MOVE(f, ((ht_tag_edit_bit*)tagstring)->offset); - return f; - } - case HT_TAG_EDIT_SELVIS: { - UNALIGNED_MOVE(f, ((ht_tag_edit_selvis*)tagstring)->offset); - return f; - } - case HT_TAG_DESC_BYTE: { - UNALIGNED_MOVE(f, ((ht_tag_desc_byte*)tagstring)->offset); - return f; - } + case HT_TAG_EDIT_TIME_VE: + return ht_tag_edit_time(tagstring).offset; + case HT_TAG_EDIT_CHAR: + return ht_tag_edit_char(tagstring).offset; + case HT_TAG_EDIT_BIT: + return ht_tag_edit_bit(tagstring).offset; + case HT_TAG_EDIT_SELVIS: + return ht_tag_edit_selvis(tagstring).offset; + case HT_TAG_DESC_BYTE: + return ht_tag_desc_byte(tagstring).offset; case HT_TAG_DESC_WORD_LE: case HT_TAG_DESC_WORD_BE: - case HT_TAG_DESC_WORD_VE: { - UNALIGNED_MOVE(f, ((ht_tag_desc_word_generic*)tagstring)->offset); - return f; - } + case HT_TAG_DESC_WORD_VE: + return ht_tag_desc_word_generic(tagstring).offset; case HT_TAG_DESC_DWORD_LE: case HT_TAG_DESC_DWORD_BE: - case HT_TAG_DESC_DWORD_VE: { - UNALIGNED_MOVE(f, ((ht_tag_desc_dword_generic*)tagstring)->offset); - return f; - } + case HT_TAG_DESC_DWORD_VE: + return ht_tag_desc_dword_generic(tagstring).offset; case HT_TAG_DESC_QWORD_LE: case HT_TAG_DESC_QWORD_BE: - case HT_TAG_DESC_QWORD_VE: { - UNALIGNED_MOVE(f, ((ht_tag_desc_qword_generic*)tagstring)->offset); - return f; - } + case HT_TAG_DESC_QWORD_VE: + return ht_tag_desc_qword_generic(tagstring).offset; case HT_TAG_FLAGS: - UNALIGNED_MOVE(f, ((ht_tag_flags*)tagstring)->offset); - return f; + return ht_tag_flags(tagstring).offset; } assert(0); return 0; @@ -831,12 +821,13 @@ FileOfs tag_get_offset(const TAGSTRING *tagstring) void tag_get_id(const TAGSTRING *tagstring, uint32 *id128_1, uint32 *id128_2, uint32 *id128_3, uint32 *id128_4) { - if (tagstring[1] == HT_TAG_SEL) { - UNALIGNED_MOVE(*id128_1, ((ht_tag_sel*)tagstring)->id128_1); - UNALIGNED_MOVE(*id128_2, ((ht_tag_sel*)tagstring)->id128_2); - UNALIGNED_MOVE(*id128_3, ((ht_tag_sel*)tagstring)->id128_3); - UNALIGNED_MOVE(*id128_4, ((ht_tag_sel*)tagstring)->id128_4); - } + if (tagstring[1] != HT_TAG_SEL) + return; + ht_tag_sel tag(tagstring); + *id128_1 = tag.id128_1; + *id128_2 = tag.id128_2; + *id128_3 = tag.id128_3; + *id128_4 = tag.id128_4; } TAGSTRING *tag_get_seltext(const TAGSTRING *tagstring) @@ -846,77 +837,95 @@ TAGSTRING *tag_get_seltext(const TAGSTRING *tagstring) int tag_get_seltextlen(const TAGSTRING *tagstring) { - if (tagstring[1] == HT_TAG_SEL) { - return ((ht_tag_sel*)tagstring)->strlen; - } - return -1; + if (tagstring[1] != HT_TAG_SEL) + return -1; + return ht_tag_sel(tagstring).strlen; } vcp tag_get_color(const TAGSTRING *tagstring) { - vcp c; - UNALIGNED_MOVE(c, ((ht_tag_color*)tagstring)->color); - return c; + return ht_tag_color(tagstring).color; } bool tag_get_desc_id(const TAGSTRING *tagstring, uint32 *id) { switch (tagstring[1]) { case HT_TAG_DESC_BYTE: - UNALIGNED_MOVE(*id, ((ht_tag_desc_byte*)tagstring)->id); + *id = ht_tag_desc_byte(tagstring).id; return true; case HT_TAG_DESC_WORD_LE: case HT_TAG_DESC_WORD_BE: case HT_TAG_DESC_WORD_VE: - UNALIGNED_MOVE(*id, ((ht_tag_desc_word_generic*)tagstring)->id); + *id = ht_tag_desc_word_generic(tagstring).id; return true; case HT_TAG_DESC_DWORD_LE: case HT_TAG_DESC_DWORD_BE: case HT_TAG_DESC_DWORD_VE: - UNALIGNED_MOVE(*id, ((ht_tag_desc_dword_generic*)tagstring)->id); + *id = ht_tag_desc_dword_generic(tagstring).id; return true; case HT_TAG_DESC_QWORD_LE: case HT_TAG_DESC_QWORD_BE: case HT_TAG_DESC_QWORD_VE: - UNALIGNED_MOVE(*id, ((ht_tag_desc_qword_generic*)tagstring)->id); + *id = ht_tag_desc_qword_generic(tagstring).id; return true; } return false; } -void tag_set_offset(const TAGSTRING *tagstring, FileOfs offset) +void tag_set_offset(TAGSTRING *tagstring, FileOfs offset) { switch (tagstring[1]) { - case HT_TAG_EDIT_BYTE: - UNALIGNED_MOVE(((ht_tag_edit_byte*)tagstring)->offset, offset); + case HT_TAG_EDIT_BYTE: { + ht_tag_edit_byte tag(tagstring); + tag.offset = offset; + tag.flush(tagstring); break; + } case HT_TAG_EDIT_WORD_LE: case HT_TAG_EDIT_WORD_BE: - case HT_TAG_EDIT_WORD_VE: - UNALIGNED_MOVE(((ht_tag_edit_word_generic*)tagstring)->offset, offset); + case HT_TAG_EDIT_WORD_VE: { + ht_tag_edit_word_generic tag(tagstring); + tag.offset = offset; + tag.flush(tagstring); break; + } case HT_TAG_EDIT_DWORD_LE: case HT_TAG_EDIT_DWORD_BE: - case HT_TAG_EDIT_DWORD_VE: - UNALIGNED_MOVE(((ht_tag_edit_dword_generic*)tagstring)->offset, offset); + case HT_TAG_EDIT_DWORD_VE: { + ht_tag_edit_dword_generic tag(tagstring); + tag.offset = offset; + tag.flush(tagstring); break; + } case HT_TAG_EDIT_QWORD_LE: case HT_TAG_EDIT_QWORD_BE: - case HT_TAG_EDIT_QWORD_VE: - UNALIGNED_MOVE(((ht_tag_edit_qword_generic*)tagstring)->offset, offset); + case HT_TAG_EDIT_QWORD_VE: { + ht_tag_edit_qword_generic tag(tagstring); + tag.offset = offset; + tag.flush(tagstring); break; + } case HT_TAG_EDIT_TIME_LE: case HT_TAG_EDIT_TIME_BE: - case HT_TAG_EDIT_TIME_VE: - UNALIGNED_MOVE(((ht_tag_edit_time*)tagstring)->offset, offset); + case HT_TAG_EDIT_TIME_VE: { + ht_tag_edit_time tag(tagstring); + tag.offset = offset; + tag.flush(tagstring); break; - case HT_TAG_EDIT_CHAR: - UNALIGNED_MOVE(((ht_tag_edit_char*)tagstring)->offset, offset); + } + case HT_TAG_EDIT_CHAR: { + ht_tag_edit_char tag(tagstring); + tag.offset = offset; + tag.flush(tagstring); break; - case HT_TAG_EDIT_BIT: - UNALIGNED_MOVE(((ht_tag_edit_bit*)tagstring)->offset, offset); + } + case HT_TAG_EDIT_BIT: { + ht_tag_edit_bit tag(tagstring); + tag.offset = offset; + tag.flush(tagstring); break; } + } } diff --git a/httag.h b/httag.h index 9ea361f..1428f02 100644 --- a/httag.h +++ b/httag.h @@ -21,10 +21,16 @@ #ifndef __HTTAG_H__ #define __HTTAG_H__ +#include #include "io/types.h" #include "io/display.h" #include "stream.h" +#define HT_TAG_BUFOP(cl) \ + inline cl(void) {}; \ + inline cl(const void *b) { memcpy(this, b, sizeof(*this)); }; \ + inline void flush(void *b) const { memcpy(b, this, sizeof(*this)); }; + /* SELECTION-TAG */ #define HT_TAG_SEL 0x01 #define HT_TAG_SEL_LEN(n) (sizeof(ht_tag_sel)+(n)) @@ -41,6 +47,8 @@ struct ht_tag_sel { ID id128_3; ID id128_4; byte strlen; + + HT_TAG_BUFOP(ht_tag_sel); } PACKED; /* FLAGS-TAG */ @@ -56,6 +64,8 @@ struct ht_tag_flags { byte magic; FileOfs offset; ID id; + + HT_TAG_BUFOP(ht_tag_flags); } PACKED; struct ht_tag_flags_s { @@ -73,6 +83,8 @@ struct ht_tag_flags_s { struct ht_tag_group { byte escape; byte magic; + + HT_TAG_BUFOP(ht_tag_group); } PACKED; /* COLOR-TAG */ @@ -86,6 +98,8 @@ struct ht_tag_color { byte escape; byte magic; uint32 color; + + HT_TAG_BUFOP(ht_tag_color); } PACKED; /* EDIT-BYTE-TAG */ @@ -101,6 +115,8 @@ struct ht_tag_edit_byte { byte escape; byte magic; FileOfs offset; + + HT_TAG_BUFOP(ht_tag_edit_byte); } PACKED; /* EDIT WORD */ @@ -109,6 +125,8 @@ struct ht_tag_edit_word_generic { byte escape; byte magic; FileOfs offset; + + HT_TAG_BUFOP(ht_tag_edit_word_generic); } PACKED; /* EDIT DWORD */ @@ -117,6 +135,8 @@ struct ht_tag_edit_dword_generic { byte escape; byte magic; FileOfs offset; + + HT_TAG_BUFOP(ht_tag_edit_dword_generic); } PACKED; /* EDIT QWORD */ @@ -125,6 +145,8 @@ struct ht_tag_edit_qword_generic { byte escape; byte magic; FileOfs offset; + + HT_TAG_BUFOP(ht_tag_edit_qword_generic); } PACKED; /* EDIT-WORD-TAG (little-endian) */ @@ -238,6 +260,8 @@ struct ht_tag_edit_time { byte escape; byte magic; FileOfs offset; + + HT_TAG_BUFOP(ht_tag_edit_time); } PACKED; /* EDIT-CHAR-TAG */ @@ -253,6 +277,8 @@ struct ht_tag_edit_char { byte escape; byte magic; FileOfs offset; + + HT_TAG_BUFOP(ht_tag_edit_char); } PACKED; /* EDIT-BIT-TAG */ @@ -269,6 +295,8 @@ struct ht_tag_edit_bit { byte magic; FileOfs offset; byte bitidx; + + HT_TAG_BUFOP(ht_tag_edit_bit); } PACKED; /* EDIT-SELVIS-TAG */ @@ -284,6 +312,8 @@ struct ht_tag_edit_selvis { byte magic; FileOfs offset; char ch; + + HT_TAG_BUFOP(ht_tag_edit_selvis); } PACKED; /* DESC-BYTE-TAG */ @@ -298,6 +328,8 @@ struct ht_tag_desc_byte { byte magic; ID id; FileOfs offset; + + HT_TAG_BUFOP(ht_tag_desc_byte); } PACKED; /* DESC WORD */ @@ -306,6 +338,8 @@ struct ht_tag_desc_word_generic { byte magic; ID id; FileOfs offset; + + HT_TAG_BUFOP(ht_tag_desc_word_generic); } PACKED; /* DESC DWORD */ @@ -314,6 +348,8 @@ struct ht_tag_desc_dword_generic { byte magic; ID id; FileOfs offset; + + HT_TAG_BUFOP(ht_tag_desc_dword_generic); } PACKED; /* DESC QWORD */ @@ -322,6 +358,8 @@ struct ht_tag_desc_qword_generic { byte magic; ID id; FileOfs offset; + + HT_TAG_BUFOP(ht_tag_desc_qword_generic); } PACKED; /* DESC-WORD-TAG (little-endian) */ diff --git a/tools.h b/tools.h index 72cc7e7..a7433ef 100644 --- a/tools.h +++ b/tools.h @@ -29,9 +29,6 @@ #include "config.h" #endif -#define UNALIGNED_MOVE(a, b) memcpy(&(a), &(b), sizeof(a)) -#define UNALIGNED_MOVE_CONST(a, b, type) {assert(sizeof(a)==sizeof(type));type c = b;memcpy(&(a), &c, sizeof(a));} - uint32 delinearize(uint32 d); uint64 delinearize64(uint64 d); From 415bfd81fb8c382e066933263b7d9c7460e66fea Mon Sep 17 00:00:00 2001 From: seppel Date: Sun, 4 Mar 2012 21:42:45 +0000 Subject: [PATCH 39/53] *** empty log message *** --- httag.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/httag.cc b/httag.cc index 32ec4d5..90467cf 100644 --- a/httag.cc +++ b/httag.cc @@ -80,6 +80,7 @@ TAGSTRING *tag_make_ref_len(TAGSTRING *buf, int maxlen, uint32 id128_1, uint32 i tag.id128_4 = id128_4; tag.strlen = strlen; tag.flush(buf); + memcpy(buf + sizeof(tag), string, strlen); return buf + sizeof(tag) + strlen; } From 4b4867f32361f69639131edf8c798501b4bf352b Mon Sep 17 00:00:00 2001 From: seppel Date: Sun, 4 Mar 2012 22:44:03 +0000 Subject: [PATCH 40/53] *** empty log message *** --- ChangeLog | 4 +++- Makefile.am | 13 ++++++---- analyser/Makefile.am | 7 +++++- asm/Makefile.am | 7 ++++-- configure.in | 54 ++++++++++++++++++++++++++---------------- doc/ht.texi | 4 ++-- eval/Makefile.am | 8 ++++--- info/Makefile.am | 7 ++++-- io/Makefile.am | 6 +++-- io/djgpp/Makefile.am | 8 +++++++ io/posix/Makefile.am | 7 ++++-- io/posix/sysdisplay.cc | 2 +- io/win32/Makefile.am | 6 +++-- minilzo/Makefile.am | 9 ++++--- output/Makefile.am | 7 +++++- tools/Makefile.am | 4 ++++ 16 files changed, 106 insertions(+), 47 deletions(-) create mode 100644 io/djgpp/Makefile.am diff --git a/ChangeLog b/ChangeLog index c89a836..2b23765 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,10 @@ HT ChangeLog ============== -version 2.0.20: +version 2.0.21: - Fixed usage of unaliged pointers (Thanks Jan) + - Restructed configure/makefile for better handling of + ncurses depedency (Thanks Jan) version 2.0.20: - Fixed loading of 32 bit ELFs (Thanks Oleg) diff --git a/Makefile.am b/Makefile.am index 629b153..fef3ad7 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,5 +1,12 @@ AUTOMAKE_OPTIONS = foreign +AM_CPPFLAGS = ${my_CPPFLAGS} -I$(srcdir)/$(ANALYSER_DIR) \ + -I$(srcdir)/$(ASM_DIR) -I$(srcdir)/$(INFO_DIR) \ + -I$(srcdir)/$(IO_DIR) -I$(srcdir)/$(COMIO_DIR) \ + -I$(srcdir)/$(OUTPUT_DIR) -I$(srcdir)/$(EVAL_DIR) -I$(srcdir) +AM_CFLAGS = ${my_CFLAGS} +AM_CXXFLAGS = ${my_CXXFLAGS} + bin_PROGRAMS = ht ANALYSER_DIR = analyser @@ -13,10 +20,8 @@ EVAL_DIR = eval EXTRA_DIST = TODO ChangeLog README KNOWNBUGS INSTALL COPYING AUTHORS SUBDIRS = tools analyser asm doc info io output eval -INCLUDES = -I$(srcdir)/$(ANALYSER_DIR) -I$(srcdir)/$(ASM_DIR) -I$(srcdir)/$(INFO_DIR) -I$(srcdir)/$(IO_DIR) -I$(srcdir)/$(COMIO_DIR) -I$(srcdir)/$(OUTPUT_DIR) -I$(srcdir)/$(EVAL_DIR) -I$(srcdir) - -ht_LDADD = $(ANALYSER_DIR)/libanalyser.a $(ASM_DIR)/libasm.a $(INFO_DIR)/libinfo.a $(IO_DIR)/libhtio.a $(OUTPUT_DIR)/liboutput.a $(COMIO_DIR)/libcomio.a $(EVAL_DIR)/libhteval.a @HT_LIBS@ @LZO_LIBS@ -ht_LDFLAGS = @HT_LDFLAGS@ +ht_LDADD = $(ANALYSER_DIR)/libanalyser.a $(ASM_DIR)/libasm.a $(INFO_DIR)/libinfo.a $(IO_DIR)/libhtio.a $(OUTPUT_DIR)/liboutput.a $(COMIO_DIR)/libcomio.a $(EVAL_DIR)/libhteval.a ${HT_LIBS} ${LZO_LIBS} ${curses_LIBS} +ht_LDFLAGS = ${HT_LDFLAGS} if ENABLE_INCLUDED_LZO SUBDIRS += minilzo diff --git a/analyser/Makefile.am b/analyser/Makefile.am index d893f64..1c58803 100644 --- a/analyser/Makefile.am +++ b/analyser/Makefile.am @@ -1,5 +1,11 @@ AUTOMAKE_OPTIONS = foreign +AM_CPPFLAGS = ${my_CPPFLAGS} -I$(top_srcdir) -I$(top_srcdir)/asm \ + -I$(top_srcdir)/io/@IO_DIR@ -I$(top_srcdir)/io \ + -I$(top_srcdir)/output -I$(top_srcdir)/eval +AM_CFLAGS = ${my_CFLAGS} +AM_CXXFLAGS = ${my_CXXFLAGS} + noinst_LIBRARIES = libanalyser.a libanalyser_a_SOURCES = analy.cc analy.h analy_alpha.cc analy_alpha.h \ @@ -14,5 +20,4 @@ analy_ppc.cc analy_ppc.h macho_analy.cc macho_analy.h flt_analy.cc flt_analy.h \ xbe_analy.cc xbe_analy.h pef_analy.cc pef_analy.h analy_arm.cc analy_arm.h \ xex_analy.cc xex_analy.h -INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/asm -I$(top_srcdir)/io/@IO_DIR@ -I$(top_srcdir)/io -I$(top_srcdir)/output -I$(top_srcdir)/eval diff --git a/asm/Makefile.am b/asm/Makefile.am index ebd9491..863c9ee 100644 --- a/asm/Makefile.am +++ b/asm/Makefile.am @@ -1,5 +1,10 @@ AUTOMAKE_OPTIONS = foreign +AM_CPPFLAGS = ${my_CPPFLAGS} -I$(top_srcdir) -I$(top_srcdir)/io/${IO_DIR} \ + -I$(top_srcdir)/io +AM_CFLAGS = ${my_CFLAGS} +AM_CXXFLAGS = ${my_CXXFLAGS} + noinst_LIBRARIES = libasm.a libasm_a_SOURCES = alphadis.cc alphadis.h alphaopc.cc alphaopc.h\ @@ -8,5 +13,3 @@ javadis.cc javadis.h javaopc.cc javaopc.h ildis.cc ildis.h \ ilopc.cc ilopc.h ia64dis.cc ia64dis.h ia64opc.cc ia64opc.h \ ppcopc.cc ppcopc.h ppcdis.cc ppcdis.h armdis.cc armdis.h \ arm-dis.cc dis-asm.h arm.h - -INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/io/@IO_DIR@ -I$(top_srcdir)/io diff --git a/configure.in b/configure.in index a6352ca..6494aaa 100644 --- a/configure.in +++ b/configure.in @@ -15,17 +15,24 @@ AC_ARG_ENABLE(release, AC_ARG_ENABLE(profiling, [ --enable-profiling make a profile build [default=no]],,enable_profiling="no") +# Certain flags that shall always be present even if user does make CFLAGS="" +my_CPPFLAGS="-DNOMACROS" +my_CFLAGS="-Wall -fsigned-char" +my_CXXFLAGS="-Wall -Woverloaded-virtual -Wnon-virtual-dtor -fsigned-char" + if test "x$enable_maintainermode" = "xno"; then if test "x$enable_release" = "xyes"; then - FLAGS_ALL="-O3 -fomit-frame-pointer -Wall -fsigned-char" + default_user_CFLAGS="-O3 -fomit-frame-pointer" else - FLAGS_ALL="-ggdb -g3 -O0 -Wall -fsigned-char" + default_user_CFLAGS="-ggdb3 -O0 -Wall" fi if test "x$enable_profiling" = "xyes"; then - FLAGS_ALL="$FLAGS_ALL -pg -g" + default_user_CFLAGS="$default_user_CFLAGS -pg -g" fi fi +CFLAGS="$default_user_CFLAGS" +CXXFLAGS="$default_user_CFLAGS" AM_INIT_AUTOMAKE AM_CONFIG_HEADER(config.h) @@ -43,14 +50,14 @@ linux*) NEED_CURSES=1 HAVE_PIPE=1 HT_LIBS="$HT_LIBS -lm" - FLAGS_ALL="$FLAGS_ALL -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" + my_CPPFLAGS="$my_CPPFLAGS -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" ;; *freebsd*) IO_DIR=posix echo "*** FREEBSD, building native FreeBSD version. we need (n)curses." 1>&2 NEED_CURSES=1 HAVE_PIPE=1 - FLAGS_ALL="$FLAGS_ALL -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" + my_CPPFLAGS="$my_CPPFLAGS -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" ;; *openbsd*) IO_DIR=posix @@ -58,12 +65,12 @@ linux*) NEED_CURSES=1 HAVE_PIPE=1 HT_X11BASE="-L${X11BASE}/lib" - FLAGS_ALL="$FLAGS_ALL -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" + my_CPPFLAGS="$my_CPPFLAGS -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" ;; cygwin*) IO_DIR=win32 echo "*** CYGWIN, building native Win32 version (no cygwin.dll)" 1>&2 - FLAGS_ALL="$FLAGS_ALL -mno-cygwin" + my_CFLAGS="$my_CFLAGS -mno-cygwin" NEED_CURSES=0 HAVE_PIPE=1 ;; @@ -80,17 +87,14 @@ mingw32*) echo "*** POSIX-generic, we need (n)curses, '-pipe' disabled for safety" 1>&2 NEED_CURSES=1 HAVE_PIPE=0 - FLAGS_ALL="$FLAGS_ALL -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" + my_CPPFLAGS="$my_CPPFLAGS -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" ;; esac if test "x$HAVE_PIPE" = "x1"; then - FLAGS_PIPE="-pipe"; + my_CFLAGS="$my_CFLAGS -pipe"; fi -CXXFLAGS="-DNOMACROS $FLAGS_PIPE $FLAGS_ALL -Woverloaded-virtual -Wnon-virtual-dtor $CXXFLAGS" -CFLAGS="-DNOMACROS $FLAGS_PIPE $FLAGS_ALL $CFLAGS" - AC_DEFINE_UNQUOTED(SYSTEM_OSAPI_SPECIFIC_TYPES_HDR, "io/$IO_DIR/types.h", [Location of io/$IO_DIR/types.h]) AM_CONDITIONAL(USE_POSIX_DIR, test x$IO_DIR = xposix) @@ -121,8 +125,8 @@ if test "${GXX}" = yes; then 1.*|2.*|3.*|4.0|4.1|4.2|4.3) ;; *) -dnl CXXFLAGS="$CXXFLAGS -march=native" -dnl CFLAGS="$CFLAGS -march=native" +dnl my_CXXFLAGS="$my_CXXFLAGS -march=native" +dnl my_CFLAGS="$my_CFLAGS -march=native" ;; esac fi @@ -192,14 +196,22 @@ AC_CHECK_HEADERS([stdint.h]) dnl AC_CONFIG_HEADER(config.h) CURSES_LIB= if test "x$NEED_CURSES" = "x1"; then - AC_CHECK_HEADERS(ncurses.h, AC_DEFINE(CURSES_HDR, , [This system provides (n)curses.h/wide]) CURSES_LIB=ncursesw) - if test "x$CURSES_LIB" = "x"; then - AC_CHECK_HEADERS(curses.h, AC_DEFINE(CURSES_HDR, , [This system provides (n)curses.h]) CURSES_LIB=curses) - if test "x$CURSES_LIB" = "x"; then - AC_MSG_ERROR([*** (n)curses.h needed ***]) - fi + AC_CHECK_PROGS([ncurses_config], + [ncursesw6-config ncursesw5-config ncurses6-config ncurses5-config]) + if test "x$ncurses_config" != "x"; then + curses_CPPFLAGS="$($ncurses_config --cflags)" + curses_LIBS="$($ncurses_config --libs)" + AC_DEFINE([CURSES_HDR], [], [This system provides ncurses.h]) + else + AC_SEARCH_LIBS([initscr], [ncursesw ncurses curses], [curses_LIBS="$LIBS"; LIBS=""]) + AC_CHECK_HEADERS([curses.h], [AC_DEFINE([CURSES_HDR], [], [This system provides curses.h])]) + AC_CHECK_HEADERS([ncurses.h], [AC_DEFINE([CURSES_HDR], [], [This system provides ncurses.h])]) + fi + if test "x$curses_LIBS" = "x"; then + AC_MSG_ERROR([*** (n)curses.h needed ***]) fi - HT_LIBS="$HT_LIBS -l$CURSES_LIB" + AC_SUBST([curses_CPPFLAGS]) + AC_SUBST([curses_LIBS]) fi dnl Makefile vars. diff --git a/doc/ht.texi b/doc/ht.texi index d99107a..ab7fc10 100644 --- a/doc/ht.texi +++ b/doc/ht.texi @@ -78,7 +78,7 @@ be registered in certain jurisdictions. @c @macro htversion -2.0.19 +2.0.21 @end macro @macro hturl @@ -456,7 +456,7 @@ details (sorry but a detailed help would get outdated rather soon). The symbol _ always refers to the last result. If you are in a hex buffer, the variable @code{first} contains the offset of the first byte and the variable -@code{last} contains the offset of the last byte. This is useful, for instace, if you want to jump to the last byte of a file. +@code{last} contains the offset of the last byte. This is useful, for instance, if you want to jump to the last byte of a file. When using @xref{Block operations}, or searching you have some context depending functions and symbols; see these sections for explanation. diff --git a/eval/Makefile.am b/eval/Makefile.am index ef147c8..3324f3e 100644 --- a/eval/Makefile.am +++ b/eval/Makefile.am @@ -1,12 +1,14 @@ -YFLAGS=-d -LFLAGS= +AM_CPPFLAGS = ${my_CPPFLAGS} -I$(srcdir) -I$(top_srcdir) +AM_CFLAGS = ${my_CFLAGS} +AM_CXXFLAGS = ${my_CXXFLAGS} +AM_YFLAGS = -d +AM_LFLAGS = AUTOMAKE_OPTIONS=foreign noinst_LIBRARIES = libhteval.a libhteval_a_SOURCES = evalparse.y evalparse.h eval.cc eval.h lex.l lex.h evalx.c evalx.h evaltype.h -INCLUDES = -I$(srcdir) -I$(top_srcdir) #bin_PROGRAMS = testeval #testeval_SOURCES = testeval.c diff --git a/info/Makefile.am b/info/Makefile.am index d40cfd4..4818dbd 100644 --- a/info/Makefile.am +++ b/info/Makefile.am @@ -1,7 +1,10 @@ AUTOMAKE_OPTIONS = foreign +AM_CPPFLAGS = ${my_CPPFLAGS} -I$(top_srcdir) -I$(top_srcdir)/io/${IO_DIR} \ + -I$(top_srcdir)/io -I$(top_srcdir)/eval +AM_CFLAGS = ${my_CFLAGS} +AM_CXXFLAGS = ${my_CXXFLAGS} + noinst_LIBRARIES = libinfo.a libinfo_a_SOURCES = infoview.cc infoview.h - -INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/io/@IO_DIR@ -I$(top_srcdir)/io -I$(top_srcdir)/eval diff --git a/io/Makefile.am b/io/Makefile.am index 98da490..2c6461b 100644 --- a/io/Makefile.am +++ b/io/Makefile.am @@ -1,5 +1,9 @@ AUTOMAKE_OPTIONS=foreign +AM_CPPFLAGS = ${my_CPPFLAGS} -I$(srcdir) -I$(top_srcdir) -I$(srcdir)/$(MY_IO_DIR) +AM_CFLAGS = ${my_CFLAGS} +AM_CXXFLAGS = ${my_CXXFLAGS} + if USE_POSIX_DIR MY_IO_DIR=posix endif @@ -16,7 +20,5 @@ noinst_LIBRARIES = libcomio.a libcomio_a_SOURCES = bounds.h display.cc display.h keyb.cc keyb.h sys.cc sys.h \ file.cc file.h fileofs.h types.h event.h -INCLUDES = -I$(srcdir) -I$(top_srcdir) -I$(srcdir)/$(MY_IO_DIR) - SUBDIRS = $(MY_IO_DIR) EXTRA_SUBDIRS = djgpp posix win32 diff --git a/io/djgpp/Makefile.am b/io/djgpp/Makefile.am new file mode 100644 index 0000000..bf6a996 --- /dev/null +++ b/io/djgpp/Makefile.am @@ -0,0 +1,8 @@ +AUTOMAKE_OPTIONS = foreign + +AM_CPPFLAGS = ${my_CPPFLAGS} -I$(top_srcdir) -I$(top_srcdir)/io +AM_CFLAGS = ${my_CFLAGS} +AM_CXXFLAGS = ${my_CXXFLAGS} + +noinst_LIBRARIES = libhtio.a +libhtio_a_SOURCES = htcurses.cc htcurses.h htkeyb.cc htkeyb.h htsys.cc htsys.h diff --git a/io/posix/Makefile.am b/io/posix/Makefile.am index 1c6c9b3..c0896d6 100644 --- a/io/posix/Makefile.am +++ b/io/posix/Makefile.am @@ -1,8 +1,11 @@ AUTOMAKE_OPTIONS = foreign +AM_CPPFLAGS = ${my_CPPFLAGS} -I$(top_srcdir) -I$(top_srcdir)/io \ + ${curses_CPPFLAGS} +AM_CFLAGS = ${my_CFLAGS} +AM_CXXFLAGS = ${my_CXXFLAGS} + noinst_LIBRARIES = libhtio.a libhtio_a_SOURCES = event.cc sysfile.cc sysdisplay.cc syskeyb.cc sysinit.cc \ sysclipboard.cc types.h #htcurses.cc htcurses.h htkeyb.cc htkeyb.h htsys.cc htsys.h - -INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/io diff --git a/io/posix/sysdisplay.cc b/io/posix/sysdisplay.cc index bd47bdb..1724884 100644 --- a/io/posix/sysdisplay.cc +++ b/io/posix/sysdisplay.cc @@ -352,7 +352,7 @@ void CursesSystemDisplay::term_on() ::nodelay(win, 1); ::noecho(); ::cbreak(); - ESCDELAY = 500; + ::set_escdelay(500); assign(0, 0, getmaxx(win), getmaxy(win)); } diff --git a/io/win32/Makefile.am b/io/win32/Makefile.am index 595a62e..4cfb39f 100644 --- a/io/win32/Makefile.am +++ b/io/win32/Makefile.am @@ -1,6 +1,8 @@ AUTOMAKE_OPTIONS = foreign +AM_CPPFLAGS = ${my_CPPFLAGS} -I$(top_srcdir) -I$(top_srcdir)/io +AM_CFLAGS = ${my_CFLAGS} +AM_CXXFLAGS = ${my_CXXFLAGS} + noinst_LIBRARIES = libhtio.a libhtio_a_SOURCES = syskeyb.cc sysfile.cc sysclipboard.cc sysdisplay.cc types.h - -INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/io diff --git a/minilzo/Makefile.am b/minilzo/Makefile.am index 9b03d6d..51be52c 100644 --- a/minilzo/Makefile.am +++ b/minilzo/Makefile.am @@ -1,8 +1,11 @@ AUTOMAKE_OPTIONS = foreign +AM_CPPFLAGS = ${my_CPPFLAGS} -I$(top_srcdir) -I$(top_srcdir)/asm \ + -I$(top_srcdir)/io/@IO_DIR@ -I$(top_srcdir)/io \ + -I$(top_srcdir)/output +AM_CFLAGS = ${my_CFLAGS} +AM_CXXFLAGS = ${my_CXXFLAGS} + noinst_LIBRARIES = liblzo.a liblzo_a_SOURCES = lzoconf.h lzodefs.h minilzo.c minilzo.h - -INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/asm -I$(top_srcdir)/io/@IO_DIR@ -I$(top_srcdir)/io -I$(top_srcdir)/output - diff --git a/output/Makefile.am b/output/Makefile.am index 0f15e4c..0bb6ea1 100644 --- a/output/Makefile.am +++ b/output/Makefile.am @@ -1,8 +1,13 @@ AUTOMAKE_OPTIONS = foreign +AM_CPPFLAGS = ${my_CPPFLAGS} -I$(top_srcdir) -I$(top_srcdir)/analyser \ + -I$(top_srcdir)/asm -I$(top_srcdir)/io/${IO_DIR} \ + -I$(top_srcdir)/io -I$(top_srcdir)/output +AM_CFLAGS = ${my_CFLAGS} +AM_CXXFLAGS = ${my_CXXFLAGS} + noinst_LIBRARIES = liboutput.a liboutput_a_SOURCES = out_html.cc out_html.h out.cc out.h out_ht.cc out_ht.h \ out_sym.cc out_sym.h out_txt.cc out_txt.h -INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/analyser -I$(top_srcdir)/asm -I$(top_srcdir)/io/@IO_DIR@ -I$(top_srcdir)/io -I$(top_srcdir)/output diff --git a/tools/Makefile.am b/tools/Makefile.am index 7b286cf..6b40c89 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -1,5 +1,9 @@ AUTOMAKE_OPTIONS = foreign +AM_CPPFLAGS = ${my_CPPFLAGS} +AM_CFLAGS = ${my_CFLAGS} +AM_CXXFLAGS = ${my_CXXFLAGS} + noinst_PROGRAMS = bin2c bin2c_LDADD = From be9b84251882659a79b4e93f6302e05d529b8ff6 Mon Sep 17 00:00:00 2001 From: seppel Date: Wed, 24 Oct 2012 00:33:21 +0000 Subject: [PATCH 41/53] *** empty log message *** --- ChangeLog | 1 + asm/x86opc.cc | 34 +++++++++++++++++++++++++++++----- asm/x86opc.h | 2 +- main.cc | 3 ++- 4 files changed, 33 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2b23765..b7e5d85 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,7 @@ ============== version 2.0.21: + - [x86] AVX2 updates - Fixed usage of unaliged pointers (Thanks Jan) - Restructed configure/makefile for better handling of ncurses depedency (Thanks Jan) diff --git a/asm/x86opc.cc b/asm/x86opc.cc index 7f916c9..9f4275f 100644 --- a/asm/x86opc.cc +++ b/asm/x86opc.cc @@ -445,6 +445,7 @@ const char *x86_segs[8] = { #define GROUP_SPECIAL_0FAE_6 11 #define GROUP_SPECIAL_0FAE_7 12 #define GROUP_SPECIAL_0FC7_6 13 +#define GROUP_SPECIAL_0FC7_7 14 #define GROUP_0FAE 0 #define GROUP_660F71 1 @@ -1771,7 +1772,12 @@ x86opc_insn x86_opc_group_insns[X86_OPC_GROUPS][256] = { /* f0 */ {"movbe", {Gv, Mv}}, {"movbe", {Mv, Gv}}, -{0}, {0}, {0}, {0}, {0}, {0}, +{0}, +{0}, +{0}, +{0}, +{"adox", {Gr, Er}}, +{0}, /* f8 */ {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, }, @@ -1913,7 +1919,12 @@ x86opc_insn x86_opc_group_insns[X86_OPC_GROUPS][256] = { /* f0 */ {"movbe", {Gv, Mv}}, {"movbe", {Mv, Gv}}, -{0}, {0}, {0}, {0}, {0}, {0}, +{0}, +{0}, +{0}, +{0}, +{"adcx", {Gr, Er}}, +{0}, /* f8 */ {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, }, @@ -2898,7 +2909,7 @@ x86opc_insn x86_group_insns[][8] = { {0}, {0}, {0, {SPECIAL_TYPE_SGROUP, GROUP_SPECIAL_0FC7_6}}, -{"vmptrst", {Mq}}, +{0, {SPECIAL_TYPE_SGROUP, GROUP_SPECIAL_0FC7_7}}, }, /* 25 - GROUP_EXT_66_C7 */ { @@ -2942,8 +2953,8 @@ x86opc_insn x86_special_group_insns[X86_SPECIAL_GROUPS][9] = { { {"monitor"}, {"mwait"}, -{0}, -{0}, +{"clac"}, +{"stac"}, {0}, {0}, {0}, @@ -3107,6 +3118,19 @@ x86opc_insn x86_special_group_insns[X86_SPECIAL_GROUPS][9] = { // with mod!=11: {"vmptrld", {Mq}}, }, +/* 13 - GROUP_SPECIAL_0FC7_7 */ +{ +{"rdseed", {Rv}}, +{"rdseed", {Rv}}, +{"rdseed", {Rv}}, +{"rdseed", {Rv}}, +{"rdseed", {Rv}}, +{"rdseed", {Rv}}, +{"rdseed", {Rv}}, +{"rdseed", {Rv}}, +// with mod!=11: +{"vmptrst", {Mq}}, +}, }; /* diff --git a/asm/x86opc.h b/asm/x86opc.h index 86b0fd2..5aab4a4 100644 --- a/asm/x86opc.h +++ b/asm/x86opc.h @@ -260,7 +260,7 @@ struct x86opc_finsn { #define X86_REG_IP 66 #define X86_OPC_GROUPS 9 -#define X86_SPECIAL_GROUPS 14 +#define X86_SPECIAL_GROUPS 15 extern x86opc_insn x86_les; extern x86opc_insn x86_lds; diff --git a/main.cc b/main.cc index 8bc7c37..f8a4fb8 100644 --- a/main.cc +++ b/main.cc @@ -300,7 +300,8 @@ int main(int argc, char *argv[]) case LS_OK: break; case LS_ERROR_NOT_FOUND: - LOG_EX(LOG_WARN, "couldn't load configuration file, using defaults"); + LOG_EX(LOG_WARN, "no configuration file found, using defaults"); + LOG_EX(LOG_WARN, "note that %s has no mouse support. Use the keyboard!", ht_name); break; case LS_ERROR_READ: LOG_EX(LOG_ERROR, "couldn't read configuration file..."); From 4fa70e14679455964b7c6b6b6c6ad0626eec1853 Mon Sep 17 00:00:00 2001 From: seppel Date: Tue, 20 Nov 2012 06:04:53 +0000 Subject: [PATCH 42/53] *** empty log message *** --- ChangeLog | 3 +++ htanaly.cc | 11 +++++++---- htanaly.h | 5 +++-- httext.cc | 1 - httree.cc | 5 +++-- httree.h | 2 +- syntax.cc | 4 ++-- 7 files changed, 19 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index b7e5d85..ec18a0c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,9 @@ HT ChangeLog ============== +version 2.0.22: + - Fixed selection of nodes in call chain + version 2.0.21: - [x86] AVX2 updates - Fixed usage of unaliged pointers (Thanks Jan) diff --git a/htanaly.cc b/htanaly.cc index be0aa32..4616017 100644 --- a/htanaly.cc +++ b/htanaly.cc @@ -350,7 +350,7 @@ char *CallChain::get_text(void *node) char sign = '+'; if (d < 0) { d = -d; - sign = '-'; + sign = '-'; } global_analyser_address_string_format = ADDRESS_STRING_FORMAT_COMPACT | ADDRESS_STRING_FORMAT_ADD_0X; ht_snprintf(stupid, sizeof stupid, "%s%c%x (%y)", @@ -376,6 +376,11 @@ void CallChain::select_node(void *node) { } +CallChainNode *CallChain::get_current_node() +{ + return (CallChainNode*)selected; +} + ///////////////////////////////////////////////////////////////////////////// @@ -1650,9 +1655,7 @@ void ht_aviewer::showCallChain(Address *Addr) dialog->insert(bt); int r = dialog->run(false); if (r == button_ok) { - ht_treeview_data tvd; - ViewDataBuf vdb(dialog, &tvd, sizeof tvd); - gotoAddress(((CallChainNode*)tvd.selected)->xa, this); + gotoAddress(cc->get_current_node()->xa, this); } dialog->done(); delete dialog; diff --git a/htanaly.h b/htanaly.h index 0f692c9..cc4238f 100644 --- a/htanaly.h +++ b/htanaly.h @@ -115,7 +115,7 @@ class CallChain: public ht_treeview { Analyser *analy; CallChainNode *root; public: - void init(Bounds *b, Analyser *analy, Address *a, char *desc); + void init(Bounds *b, Analyser *analy, Address *a, char *desc); virtual void done(); virtual void adjust(void *node, bool expand); virtual void *get_child(void *node, int i); @@ -126,9 +126,10 @@ class CallChain: public ht_treeview { virtual bool has_children(void *node); virtual bool is_expanded(void *node); virtual void select_node(void *node); + CallChainNode *get_current_node(); private: CallChainNode *createNode(Address *a); - void examineNode(CallChainNode *n); + void examineNode(CallChainNode *n); }; /* * diff --git a/httext.cc b/httext.cc index b6c7257..37d0b3a 100644 --- a/httext.cc +++ b/httext.cc @@ -1,5 +1,4 @@ /* - * HT Editor * httext.cc * diff --git a/httree.cc b/httree.cc index efb06f5..25e3bf4 100644 --- a/httree.cc +++ b/httree.cc @@ -158,11 +158,12 @@ void ht_treeview::expand_all(void *node) } /* - * stub */ void ht_treeview::getdata(ObjectStream &s) { - PUT_INT32D(s, (long)selected); + ht_treeview_data d; + d.selected = selected; + PUTX_BINARY(s, &d, sizeof d, NULL); } /* diff --git a/httree.h b/httree.h index 3257240..a899105 100644 --- a/httree.h +++ b/httree.h @@ -26,7 +26,7 @@ #include "io/types.h" struct ht_treeview_data { - DDECL_PTR(void *, selected); + DDECL_PTR(void, selected); }; class ht_treeview: public ht_view { diff --git a/syntax.cc b/syntax.cc index 844e9cb..03c1815 100644 --- a/syntax.cc +++ b/syntax.cc @@ -315,7 +315,7 @@ syntax_lexer_rule c_syntax_lexer_rules[]={ { LSTSET(LEX_CST_NORMAL), false, LRST_REGEX, "'\\\\.{1,3}'", 0, LEX_CTOK_CHAR }, /**/ - { 0, 0, LRST_EMPTY, false, false, 0 } + { 0 } }; const char *c_reserved[]= @@ -553,7 +553,7 @@ syntax_lexer_rule html_syntax_lexer_rules[] = { false, LRST_REGEX, "&[#A-Za-z0-9]+?;", 0, LEX_HTMLTOK_ENTITY }, // SL_RULE_ANYCHAR(LSTSET(LEX_HTMLST_NORMAL), LEX_HTMLTOK_NORMAL), /**/ - { 0, 0, LRST_EMPTY, false, false, 0 } + { 0 } }; #endif From bdead9dc1e1554bfba3cce010f5e9956f576e234 Mon Sep 17 00:00:00 2001 From: seppel Date: Wed, 21 Nov 2012 04:05:47 +0000 Subject: [PATCH 43/53] *** empty log message *** --- htapp.cc | 13 +++++++------ info/infoview.cc | 4 ++-- io/file.cc | 38 ++++++++++++++++++++++++++------------ io/file.h | 2 +- main.cc | 2 +- textedit.cc | 4 ++-- vfs.cc | 15 +++++++++------ vfs.h | 6 +++--- vfsview.cc | 4 ++-- 9 files changed, 53 insertions(+), 35 deletions(-) diff --git a/htapp.cc b/htapp.cc index 7a99e80..92f8d2f 100644 --- a/htapp.cc +++ b/htapp.cc @@ -275,10 +275,11 @@ bool FileBrowser::extract_url(char *buf) vfs_extra *x = (vfs_extra*)t->extra_data;*/ Vfs *vfs = listbox->getCurVfs(); if (vfs) { - int buflen = ht_snprintf(buf, VFS_URL_MAX, "%s:", listbox->getCurProto()); char fname[VFS_URL_MAX]; + String res; bin2str(fname, i.text, i.textlen); - vfs->canonicalize(buf+buflen, fname, listbox->getCurDir()); + vfs->canonicalize(res, fname, listbox->getCurDir()); + int buflen = ht_snprintf(buf, VFS_URL_MAX, "%s:%y", listbox->getCurProto(), &res); return true; } return false; @@ -819,7 +820,7 @@ void ht_project_listbox::handlemsg(htmsg *msg) if (file_chooser("Add project item", fn, sizeof fn)) { char ffn[HT_NAME_MAX]; char *dir; - if (sys_common_canonicalize(ffn, fn, NULL, sys_is_path_delim) == 0 + if (sys_common_canonicalize(ffn, sizeof ffn, fn, NULL, sys_is_path_delim) == 0 && sys_basename(fn, ffn) == 0 && (dir = sys_dirname(ffn)) ) { ht_project_item *p = new ht_project_item(fn, dir); @@ -900,7 +901,7 @@ bool ht_project_listbox::selectEntry(void *entry) int p = pos; ht_project_item *i = (ht_project_item *)(*project)[p]; char fn[HT_NAME_MAX]; - if (sys_common_canonicalize(fn, i->get_filename(), i->get_path(), sys_is_path_delim)==0) { + if (sys_common_canonicalize(fn, sizeof fn, i->get_filename(), i->get_path(), sys_is_path_delim)==0) { ((ht_app*)app)->create_window_file(fn, FOM_AUTO, false); } return true; @@ -2012,7 +2013,7 @@ ht_window *ht_app::create_window_help(const char *file, const char *node) cwd[0] = 0; getcwd(cwd, sizeof cwd); if (strcmp(file, "hthelp.info")) { - sys_common_canonicalize(ff, file, cwd, sys_is_path_delim); + sys_common_canonicalize(ff, sizeof ff, file, cwd, sys_is_path_delim); } else { strcpy(ff, file); } @@ -2954,7 +2955,7 @@ void ht_app::project_opencreate(const char *filename) char fn[HT_NAME_MAX]; char cwd[HT_NAME_MAX]; getcwd(cwd, sizeof cwd); - if (sys_common_canonicalize(fn, filename, cwd, sys_is_path_delim) != 0) { + if (sys_common_canonicalize(fn, sizeof fn, filename, cwd, sys_is_path_delim) != 0) { LOG("%s: invalid filename", filename); return; } diff --git a/info/infoview.cc b/info/infoview.cc index 02c3dd7..db30ff2 100644 --- a/info/infoview.cc +++ b/info/infoview.cc @@ -498,8 +498,8 @@ bool ht_info_viewer::igotonode(const char *f, const char *n, bool add2hist) } else { char ff[HT_NAME_MAX], cff[HT_NAME_MAX]; cff[0] = 0; - if (file && sys_common_canonicalize(cff, file, cwd, sys_is_path_delim) != 0) return false; - if (sys_common_canonicalize(ff, f, cwd, sys_is_path_delim) != 0) return false; + if (file && sys_common_canonicalize(cff, sizeof cff, file, cwd, sys_is_path_delim) != 0) return false; + if (sys_common_canonicalize(ff, sizeof ff, f, cwd, sys_is_path_delim) != 0) return false; if ((strcmp(ff, cff) != 0) || newnode) { if (!readfile(ff, &infotext)) return false; char *c; diff --git a/io/file.cc b/io/file.cc index c57fde0..91d2458 100755 --- a/io/file.cc +++ b/io/file.cc @@ -30,6 +30,7 @@ #include #include "strtools.h" +#include "str.h" /* * COMMON SYS @@ -147,7 +148,7 @@ static char *_str_strip(char *str, int len) 5. unsigned int at - offset in old string 6. unsigned int len - len of substring for delete ( at - start) */ -static char *_substr_replace(char *s, unsigned int s_len, char *r, unsigned int r_len,\ +static char *_substr_replace(char *s, unsigned int s_len, char *r, unsigned int r_len, unsigned int at, unsigned int len) { if (!s_len || !r_len) return NULL; @@ -379,20 +380,33 @@ bool sys_path_is_absolute(const char *filename, is_path_delim delim) return delim(filename[0]) || (isalpha(filename[0]) && (filename[1] == ':')); } -int sys_common_canonicalize(char *result, const char *filename, const char *cwd, is_path_delim delim) +int sys_common_canonicalize(char *result, int ressize, const char *filename, const char *cwd, is_path_delim delim) { - char *o = result; + String res; if (!sys_path_is_absolute(filename, delim)) { - if (cwd) strcpy(o, cwd); else return EINVAL; - int ol = strlen(o); - if (ol && !delim(o[ol-1])) { - o[ol] = '/'; - o[ol+1] = 0; + if (cwd) { + res.assign(cwd); + } else { + return EINVAL; } - } else *o = 0; - strcat(o, filename); - int k = flatten_path(o, delim); - return (k == 0) ? 0 : EINVAL; + if (res.length() > 0 && !delim(res.at(res.length()-1))) { + res.appendChar('/'); + } + } + res.append(filename); + char *f = ht_strdup(res.contentChar()); + int k = flatten_path(f, delim); + if (k != 0) { + free(f); + return EINVAL; + } + res.assign(f); + free(f); + if (res.length() + 1 > ressize) { + return EINVAL; + } + strcpy(result, res.contentChar()); + return 0; } const char *sys_filename_suffix(const char *fn) diff --git a/io/file.h b/io/file.h index 13e82ce..583d47c 100644 --- a/io/file.h +++ b/io/file.h @@ -153,7 +153,7 @@ int sys_basename(char *result, const char *filename); char * sys_dirname(char *path); char * sys_get_home_dir(); int sys_relname(char *result, const char *filename, const char *cwd); -int sys_common_canonicalize(char *result, const char *in_name, const char *cwd, is_path_delim delim); +int sys_common_canonicalize(char *result, int ressize, const char *in_name, const char *cwd, is_path_delim delim); const char * sys_filename_suffix(const char *fn); int sys_tmpfile_fd(); diff --git a/main.cc b/main.cc index f8a4fb8..9899d53 100644 --- a/main.cc +++ b/main.cc @@ -113,7 +113,7 @@ static void load_file(char *fn, uint mode) cwd[0] = 0; getcwd(cwd, sizeof cwd); - if (sys_common_canonicalize(cfn, fn, cwd, sys_is_path_delim)==0) { + if (sys_common_canonicalize(cfn, sizeof cfn, fn, cwd, sys_is_path_delim)==0) { add_file_history_entry(cfn); ((ht_app*)app)->create_window_file(cfn, mode, true); } diff --git a/textedit.cc b/textedit.cc index 0bf934e..05636d1 100644 --- a/textedit.cc +++ b/textedit.cc @@ -1309,9 +1309,9 @@ const char *ht_text_viewer::func(uint i, bool execute) return "search"; } default: - return false; + return NULL; } - return 0; + return NULL; } vcp ht_text_viewer::get_bgcolor() diff --git a/vfs.cc b/vfs.cc index e28aece..55437c7 100644 --- a/vfs.cc +++ b/vfs.cc @@ -55,9 +55,11 @@ void LocalFs::done() Vfs::done(); } -int LocalFs::canonicalize(char *result, const char *filename, const char *cwd) +int LocalFs::canonicalize(String &result, const char *filename, const char *cwd) { - sys_common_canonicalize(result, filename, cwd, sys_is_path_delim); + char res[HT_NAME_MAX]; + sys_common_canonicalize(res, sizeof res, filename, cwd, sys_is_path_delim); + result.assign(res); return 0; } @@ -271,12 +273,13 @@ void RegistryFs::done() Vfs::done(); } -int RegistryFs::canonicalize(char *result, const char *filename, const char *cwd) +int RegistryFs::canonicalize(String &result, const char *filename, const char *cwd) { + char res[HT_NAME_MAX]; + sys_common_canonicalize(res, sizeof res, filename, cwd, unix_is_path_delim); + result.assign(res); ht_registry_node *node; - - sys_common_canonicalize(result, filename, cwd, unix_is_path_delim); - return registry->find_data_entry(result, &node, 0); + return registry->find_data_entry(result.contentChar(), &node, 0); } void RegistryFs::create_pfind_t(pfind_t *f, const ht_registry_node *node) diff --git a/vfs.h b/vfs.h index b1932af..6ef7a2c 100644 --- a/vfs.h +++ b/vfs.h @@ -56,7 +56,7 @@ class RegNodeFile: public MemoryFile { class Vfs: public Object { public: /* new */ - virtual int canonicalize(char *result, const char *filename, const char *cwd) = 0; + virtual int canonicalize(String &result, const char *filename, const char *cwd) = 0; virtual int createFile(const char *filename, uint createtype) = 0; virtual int deleteFile(const char *filename) = 0; virtual void * enumFiletype(uint *type, char **name, void *handle) = 0; @@ -84,7 +84,7 @@ class LocalFs: public Vfs { void init(); virtual void done(); /* overwritten */ - virtual int canonicalize(char *result, const char *filename, const char *cwd); + virtual int canonicalize(String &result, const char *filename, const char *cwd); virtual int compareFilenames(const char *a, const char *b); virtual int createFile(const char *filename, uint createtype); virtual int deleteFile(const char *filename); @@ -119,7 +119,7 @@ class RegistryFs: public Vfs { void init(); virtual void done(); /* overwritten */ - virtual int canonicalize(char *result, const char *filename, const char *cwd); + virtual int canonicalize(String &result, const char *filename, const char *cwd); virtual int createFile(const char *filename, uint createtype); virtual int deleteFile(const char *filename); virtual void * enumFiletype(uint *type, char **name, void *handle); diff --git a/vfsview.cc b/vfsview.cc index f50c3d3..5216b95 100644 --- a/vfsview.cc +++ b/vfsview.cc @@ -151,11 +151,11 @@ int VfsListbox::changeURL(const char *url) newVfs = (Vfs*)vfs_list->get(0); } char path[VFS_DIR_MAX+1]; - if (sys_common_canonicalize(path, pathptr, NULL, newVfs->isPathDelim()) !=0) return EINVAL; + if (sys_common_canonicalize(path, sizeof path, pathptr, NULL, newVfs->isPathDelim()) !=0) return EINVAL; /* add trailing path delimiter if needed */ int l = strlen(path)-1; - if ((l==-1) || !newVfs->isPathDelim()(path[l])) { + if (l == -1 || !newVfs->isPathDelim()(path[l])) { char delim = newVfs->isPathDelim()('/') ? '/' : '\\'; if (l+2 >= (int)sizeof path) return EINVAL; path[l+1] = delim; From 825bbb1c373a2ba6bcfb5f35c2793b6d0bd716fb Mon Sep 17 00:00:00 2001 From: seppel Date: Wed, 21 Nov 2012 04:37:59 +0000 Subject: [PATCH 44/53] *** empty log message *** --- ChangeLog | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ChangeLog b/ChangeLog index ec18a0c..66c9bd0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,8 @@ version 2.0.22: - Fixed selection of nodes in call chain + - Added ability to view/edit 64 bit relocation for ELFs + (Thanks tecknicaltom) version 2.0.21: - [x86] AVX2 updates From d7f52572f628507dc5022fde8dba442a602bc4a6 Mon Sep 17 00:00:00 2001 From: seppel Date: Wed, 21 Nov 2012 04:37:59 +0000 Subject: [PATCH 45/53] *** empty log message *** --- ChangeLog | 2 +- elfstruc.h | 33 +++++++++++- htelf.h | 5 +- htelfrel.cc | 152 +++++++++++++++++++++++++++++++++++++++++++--------- htelfsym.cc | 144 ++++++++++++++++++++++++++++++++++++------------- 5 files changed, 270 insertions(+), 66 deletions(-) diff --git a/ChangeLog b/ChangeLog index 66c9bd0..0fa9d7d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,7 +3,7 @@ version 2.0.22: - Fixed selection of nodes in call chain - - Added ability to view/edit 64 bit relocation for ELFs + - Added ability to view/edit 64 bit symbols and relocation for ELFs (Thanks tecknicaltom) version 2.0.21: diff --git a/elfstruc.h b/elfstruc.h index 2a2d441..995b300 100644 --- a/elfstruc.h +++ b/elfstruc.h @@ -453,6 +453,23 @@ struct ELF_SYMBOL64 { #define ELF_R_386_GOTOFF 9 #define ELF_R_386_GOTPC 10 +#define ELF_R_X86_64_NONE 0 +#define ELF_R_X86_64_64 1 +#define ELF_R_X86_64_PC32 2 +#define ELF_R_X86_64_GOT32 3 +#define ELF_R_X86_64_PLT32 4 +#define ELF_R_X86_64_COPY 5 +#define ELF_R_X86_64_GLOB_DAT 6 +#define ELF_R_X86_64_JUMP_SLOT 7 +#define ELF_R_X86_64_RELATIVE 8 +#define ELF_R_X86_64_GOTPCREL 9 +#define ELF_R_X86_64_32 10 +#define ELF_R_X86_64_32S 11 +#define ELF_R_X86_64_16 12 +#define ELF_R_X86_64_PC16 13 +#define ELF_R_X86_64_8 14 +#define ELF_R_X86_64_PC8 15 + struct ELF_REL32 { elf32_addr r_offset; elf32_word r_info; @@ -460,7 +477,13 @@ struct ELF_REL32 { struct ELF_REL64 { elf64_addr r_offset; - elf64_word r_info; + union { + elf64_word r_info; + struct { + elf64_half r_type; + elf64_half r_sym; + }; + }; } PACKED; struct ELF_RELA32 { @@ -471,7 +494,13 @@ struct ELF_RELA32 { struct ELF_RELA64 { elf64_addr r_offset; - elf64_word r_info; + union { + elf64_word r_info; + struct { + elf64_half r_type; + elf64_half r_sym; + }; + }; elf64_sword r_addend; } PACKED; diff --git a/htelf.h b/htelf.h index 1384d7f..daeab76 100644 --- a/htelf.h +++ b/htelf.h @@ -69,7 +69,10 @@ #define ATOM_ELF_ST_TYPE_STR "454c460a" #define ATOM_ELF_R_386_TYPE 0x454c460b -#define ATOM_ELF_R_386_TYPE_STR "454c460b" +#define ATOM_ELF_R_386_TYPE_STR "454c460b" + +#define ATOM_ELF_R_X86_64_TYPE 0x454c460c +#define ATOM_ELF_R_X86_64_TYPE_STR "454c460c" extern format_viewer_if htelf_if; diff --git a/htelfrel.cc b/htelfrel.cc index 4c72bc6..8ceeebc 100644 --- a/htelfrel.cc +++ b/htelfrel.cc @@ -44,21 +44,52 @@ static int_hash elf_r_386_type[] = {0, 0} }; +static int_hash elf_r_x86_64_type[] = +{ + {ELF_R_X86_64_NONE, "ELF_R_X86_64_NONE"}, + {ELF_R_X86_64_64, "ELF_R_X86_64_64"}, + {ELF_R_X86_64_PC32, "ELF_R_X86_64_PC32"}, + {ELF_R_X86_64_GOT32, "ELF_R_X86_64_GOT32"}, + {ELF_R_X86_64_PLT32, "ELF_R_X86_64_PLT32"}, + {ELF_R_X86_64_COPY, "ELF_R_X86_64_COPY"}, + {ELF_R_X86_64_GLOB_DAT, "ELF_R_X86_64_GLOB_DAT"}, + {ELF_R_X86_64_JUMP_SLOT, "ELF_R_X86_64_JUMP_SLOT"}, + {ELF_R_X86_64_RELATIVE, "ELF_R_X86_64_RELATIVE"}, + {ELF_R_X86_64_GOTPCREL, "ELF_R_X86_64_GOTPCREL"}, + {ELF_R_X86_64_32, "ELF_R_X86_64_32"}, + {ELF_R_X86_64_32S, "ELF_R_X86_64_32S"}, + {ELF_R_X86_64_16, "ELF_R_X86_64_16"}, + {ELF_R_X86_64_PC16, "ELF_R_X86_64_PC16"}, + {ELF_R_X86_64_8, "ELF_R_X86_64_8"}, + {ELF_R_X86_64_PC8, "ELF_R_X86_64_PC8"}, + {0, 0} +}; + static ht_view *htelfreloctable_init(Bounds *b, File *file, ht_format_group *group) { ht_elf_shared_data *elf_shared=(ht_elf_shared_data *)group->get_shared_data(); - if (elf_shared->ident.e_ident[ELF_EI_CLASS] != ELFCLASS32 - || elf_shared->ident.e_ident[ELF_EI_DATA] != ELFDATA2LSB - || elf_shared->header32.e_machine != ELF_EM_386) return NULL; - + if (elf_shared->ident.e_ident[ELF_EI_CLASS] == ELFCLASS32) + { + if (elf_shared->header32.e_machine != ELF_EM_386) + return NULL; + } else if (elf_shared->ident.e_ident[ELF_EI_CLASS] == ELFCLASS64) { + if (elf_shared->header32.e_machine != ELF_EM_X86_64) + return NULL; + } else { + return NULL; + } + if ( elf_shared->ident.e_ident[ELF_EI_DATA] != ELFDATA2LSB) + return NULL; + + bool elf32 = elf_shared->ident.e_ident[ELF_EI_CLASS] == ELFCLASS32; uint skip = elf_shared->reloctables; uint reloctab_shidx = ELF_SHN_UNDEF; uint reloctab_sh_type = ELF_SHT_NULL; for (uint i=1; isheaders.count; i++) { - if ((elf_shared->sheaders.sheaders32[i].sh_type==ELF_SHT_REL) || (elf_shared->sheaders.sheaders32[i].sh_type==ELF_SHT_RELA)) { + reloctab_sh_type = elf32 ? elf_shared->sheaders.sheaders32[i].sh_type : elf_shared->sheaders.sheaders64[i].sh_type; + if ((reloctab_sh_type == ELF_SHT_REL) || (reloctab_sh_type==ELF_SHT_RELA)) { if (!skip--) { - reloctab_sh_type=elf_shared->sheaders.sheaders32[i].sh_type; reloctab_shidx=i; break; } @@ -66,19 +97,43 @@ static ht_view *htelfreloctable_init(Bounds *b, File *file, ht_format_group *gro } if (!isValidELFSectionIdx(elf_shared, reloctab_shidx)) return NULL; - FileOfs h = elf_shared->sheaders.sheaders32[reloctab_shidx].sh_offset; + FileOfs h; /* section index of associated symbol table */ - int si_symbol = elf_shared->sheaders.sheaders32[reloctab_shidx].sh_link; + int si_symbol; /* section index of section to be relocated */ - int si_dest = elf_shared->sheaders.sheaders32[reloctab_shidx].sh_info; + int si_dest; String reloctab_name("?"); - if (isValidELFSectionIdx(elf_shared, elf_shared->header32.e_shstrndx)) { - file->seek(elf_shared->sheaders.sheaders32[elf_shared->header32.e_shstrndx].sh_offset - + elf_shared->sheaders.sheaders32[reloctab_shidx].sh_name); - file->readStringz(reloctab_name); + int rel_size; + int rela_size; + uint relnum; + + if (elf32) { + h = elf_shared->sheaders.sheaders32[reloctab_shidx].sh_offset; + si_symbol = elf_shared->sheaders.sheaders32[reloctab_shidx].sh_link; + si_dest = elf_shared->sheaders.sheaders32[reloctab_shidx].sh_info; + if (isValidELFSectionIdx(elf_shared, elf_shared->header32.e_shstrndx)) { + file->seek(elf_shared->sheaders.sheaders32[elf_shared->header32.e_shstrndx].sh_offset + + elf_shared->sheaders.sheaders32[reloctab_shidx].sh_name); + file->readStringz(reloctab_name); + } + rel_size = sizeof (ELF_REL32); + rela_size = sizeof (ELF_RELA32); + relnum = elf_shared->sheaders.sheaders32[reloctab_shidx].sh_size / (reloctab_sh_type == ELF_SHT_REL ? rel_size : rela_size); + } else { + h = elf_shared->sheaders.sheaders64[reloctab_shidx].sh_offset; + si_symbol = elf_shared->sheaders.sheaders64[reloctab_shidx].sh_link; + si_dest = elf_shared->sheaders.sheaders64[reloctab_shidx].sh_info; + if (isValidELFSectionIdx(elf_shared, elf_shared->header64.e_shstrndx)) { + file->seek(elf_shared->sheaders.sheaders64[elf_shared->header64.e_shstrndx].sh_offset + + elf_shared->sheaders.sheaders64[reloctab_shidx].sh_name); + file->readStringz(reloctab_name); + } + rel_size = sizeof (ELF_REL64); + rela_size = sizeof (ELF_RELA64); + relnum = elf_shared->sheaders.sheaders64[reloctab_shidx].sh_size / (reloctab_sh_type == ELF_SHT_REL ? rel_size : rela_size); } char desc[128]; @@ -91,6 +146,7 @@ static ht_view *htelfreloctable_init(Bounds *b, File *file, ht_format_group *gro m->init(file, 0); registerAtom(ATOM_ELF_R_386_TYPE, elf_r_386_type); + registerAtom(ATOM_ELF_R_X86_64_TYPE, elf_r_x86_64_type); char t[256]; ht_snprintf(t, sizeof t, "* ELF relocation table at offset %08qx, relocates section %d, symtab %d", h, si_dest, si_symbol); @@ -98,51 +154,95 @@ static ht_view *htelfreloctable_init(Bounds *b, File *file, ht_format_group *gro m->add_mask(t); bool elf_bigendian = (elf_shared->ident.e_ident[ELF_EI_DATA] == ELFDATA2MSB); + tag_endian endianness = elf_bigendian ? tag_endian_big : tag_endian_little; #define tt_end sizeof t - (tt-t) switch (reloctab_sh_type) { case ELF_SHT_REL: { - m->add_mask("destofs symidx type"); - uint relnum=elf_shared->sheaders.sheaders32[reloctab_shidx].sh_size / sizeof (ELF_REL32); + if (elf32) { + m->add_mask("destofs symidx type"); + } else { + m->add_mask("destofs symidx type"); + } for (uint i=0; iadd_mask(t); } break; } case ELF_SHT_RELA: { - m->add_mask("destofs symidx addend type"); - uint relnum =elf_shared->sheaders.sheaders32[reloctab_shidx].sh_size / sizeof (ELF_RELA32); + if (elf32) { + m->add_mask("destofs symidx addend type"); + } else { + m->add_mask("destofs symidx addend type"); + } for (uint i=0; iadd_mask(t); } diff --git a/htelfsym.cc b/htelfsym.cc index 0296a76..e7d2467 100644 --- a/htelfsym.cc +++ b/htelfsym.cc @@ -52,12 +52,16 @@ static ht_view *htelfsymboltable_init(Bounds *b, File *file, ht_format_group *gr { ht_elf_shared_data *elf_shared=(ht_elf_shared_data *)group->get_shared_data(); - if (elf_shared->ident.e_ident[ELF_EI_CLASS]!=ELFCLASS32) return 0; + if (elf_shared->ident.e_ident[ELF_EI_CLASS]!=ELFCLASS32 && + elf_shared->ident.e_ident[ELF_EI_CLASS]!=ELFCLASS64) return 0; + bool elf32 = elf_shared->ident.e_ident[ELF_EI_CLASS] == ELFCLASS32; uint skip = elf_shared->symtables; uint symtab_shidx = ELF_SHN_UNDEF; for (uint i=1; isheaders.count; i++) { - if ((elf_shared->sheaders.sheaders32[i].sh_type == ELF_SHT_SYMTAB) || (elf_shared->sheaders.sheaders32[i].sh_type==ELF_SHT_DYNSYM)) { + if (elf32 ? + (elf_shared->sheaders.sheaders32[i].sh_type == ELF_SHT_SYMTAB) || (elf_shared->sheaders.sheaders32[i].sh_type==ELF_SHT_DYNSYM) : + (elf_shared->sheaders.sheaders64[i].sh_type == ELF_SHT_SYMTAB) || (elf_shared->sheaders.sheaders64[i].sh_type==ELF_SHT_DYNSYM) ) { if (!skip--) { symtab_shidx = i; break; @@ -66,16 +70,27 @@ static ht_view *htelfsymboltable_init(Bounds *b, File *file, ht_format_group *gr } if (!isValidELFSectionIdx(elf_shared, symtab_shidx)) return NULL; - FileOfs h = elf_shared->sheaders.sheaders32[symtab_shidx].sh_offset; + FileOfs h = elf32 ? elf_shared->sheaders.sheaders32[symtab_shidx].sh_offset : elf_shared->sheaders.sheaders64[symtab_shidx].sh_offset; /* associated string table offset (from sh_link) */ - FileOfs sto = elf_shared->sheaders.sheaders32[elf_shared->sheaders.sheaders32[symtab_shidx].sh_link].sh_offset; + FileOfs sto = elf32 ? + elf_shared->sheaders.sheaders32[elf_shared->sheaders.sheaders32[symtab_shidx].sh_link].sh_offset : + elf_shared->sheaders.sheaders64[elf_shared->sheaders.sheaders64[symtab_shidx].sh_link].sh_offset; String symtab_name("?"); - if (isValidELFSectionIdx(elf_shared, elf_shared->header32.e_shstrndx)) { - file->seek(elf_shared->sheaders.sheaders32[elf_shared->header32.e_shstrndx].sh_offset - + elf_shared->sheaders.sheaders32[symtab_shidx].sh_name); - file->readStringz(symtab_name); + if (elf32) + { + if (isValidELFSectionIdx(elf_shared, elf_shared->header32.e_shstrndx)) { + file->seek(elf_shared->sheaders.sheaders32[elf_shared->header32.e_shstrndx].sh_offset + + elf_shared->sheaders.sheaders32[symtab_shidx].sh_name); + file->readStringz(symtab_name); + } + } else { + if (isValidELFSectionIdx(elf_shared, elf_shared->header64.e_shstrndx)) { + file->seek(elf_shared->sheaders.sheaders64[elf_shared->header64.e_shstrndx].sh_offset + + elf_shared->sheaders.sheaders64[symtab_shidx].sh_name); + file->readStringz(symtab_name); + } } char desc[128]; @@ -95,22 +110,37 @@ static ht_view *htelfsymboltable_init(Bounds *b, File *file, ht_format_group *gr m->add_mask(t); bool elf_bigendian = (elf_shared->ident.e_ident[ELF_EI_DATA] == ELFDATA2MSB); - uint symnum = elf_shared->sheaders.sheaders32[symtab_shidx].sh_size / sizeof (ELF_SYMBOL32); + uint symnum = elf32 ? + elf_shared->sheaders.sheaders32[symtab_shidx].sh_size / sizeof (ELF_SYMBOL32) : + elf_shared->sheaders.sheaders64[symtab_shidx].sh_size / sizeof (ELF_SYMBOL64); /* find maximum section name length */ uint msnl = 0; for (uint i=0; i < symnum; i++) { - ELF_SYMBOL32 sym; - file->seek(h+i*sizeof (ELF_SYMBOL32)); - file->readx(&sym, sizeof sym); - createHostStruct(&sym, ELF_SYMBOL32_struct, elf_shared->byte_order); - file->seek(sto+sym.st_name); + elf64_quarter st_shndx; + if (elf32) + { + ELF_SYMBOL32 sym; + file->seek(h+i*sizeof (ELF_SYMBOL32)); + file->readx(&sym, sizeof sym); + createHostStruct(&sym, ELF_SYMBOL32_struct, elf_shared->byte_order); + file->seek(sto+sym.st_name); + st_shndx = sym.st_shndx; + } else { + ELF_SYMBOL64 sym; + file->seek(h+i*sizeof (ELF_SYMBOL64)); + file->readx(&sym, sizeof sym); + createHostStruct(&sym, ELF_SYMBOL64_struct, elf_shared->byte_order); + file->seek(sto+sym.st_name); + st_shndx = sym.st_shndx; + } + char *name = file->fgetstrz(); /* FIXME: error handling (also in elf_analy.cc) */ if (!name) continue; uint len = 0; - switch (sym.st_shndx) { + switch (st_shndx) { case ELF_SHN_UNDEF: len = strlen("*undefined"); break; @@ -121,10 +151,17 @@ static ht_view *htelfsymboltable_init(Bounds *b, File *file, ht_format_group *gr len = strlen("*common"); break; default: - if (isValidELFSectionIdx(elf_shared, sym.st_shndx)) { + if (isValidELFSectionIdx(elf_shared, st_shndx)) { String s(""); - FileOfs so = elf_shared->sheaders.sheaders32[elf_shared->header32.e_shstrndx].sh_offset; - FileOfs no = elf_shared->sheaders.sheaders32[sym.st_shndx].sh_name; + FileOfs so, no; + if (elf32) + { + so = elf_shared->sheaders.sheaders32[elf_shared->header32.e_shstrndx].sh_offset; + no = elf_shared->sheaders.sheaders32[st_shndx].sh_name; + } else { + so = elf_shared->sheaders.sheaders64[elf_shared->header64.e_shstrndx].sh_offset; + no = elf_shared->sheaders.sheaders64[st_shndx].sh_name; + } file->seek(so + no); file->readStringz(s); @@ -145,17 +182,39 @@ static ht_view *htelfsymboltable_init(Bounds *b, File *file, ht_format_group *gr char *tt = t; #define tt_end sizeof t - (tt-t) - tt += ht_snprintf(t, tt_end, "idx binding type value size "); + if (elf32) { + tt += ht_snprintf(t, tt_end, "idx binding type value size "); + } else { + tt += ht_snprintf(t, tt_end, "idx binding type value size "); + } tt += ht_snprintf(tt, tt_end, secstrfmt, "section"); tt += ht_snprintf(tt, tt_end, "name"); m->add_mask(t); for (uint i=0; i < symnum; i++) { - ELF_SYMBOL32 sym; - file->seek(h+i*sizeof (ELF_SYMBOL32)); - file->readx(&sym, sizeof sym); - createHostStruct(&sym, ELF_SYMBOL32_struct, elf_shared->byte_order); - file->seek(sto+sym.st_name); + elf64_quarter st_shndx; + int st_bind; + int st_type; + if (elf32) + { + ELF_SYMBOL32 sym; + file->seek(h+i*sizeof (ELF_SYMBOL32)); + file->readx(&sym, sizeof sym); + createHostStruct(&sym, ELF_SYMBOL32_struct, elf_shared->byte_order); + file->seek(sto+sym.st_name); + st_shndx = sym.st_shndx; + st_bind = ELF32_ST_BIND(sym.st_info); + st_type = ELF32_ST_TYPE(sym.st_info); + } else { + ELF_SYMBOL64 sym; + file->seek(h+i*sizeof (ELF_SYMBOL64)); + file->readx(&sym, sizeof sym); + createHostStruct(&sym, ELF_SYMBOL64_struct, elf_shared->byte_order); + file->seek(sto+sym.st_name); + st_shndx = sym.st_shndx; + st_bind = ELF64_ST_BIND(sym.st_info); + st_type = ELF64_ST_TYPE(sym.st_info); + } char *name = file->fgetstrz(); /* FIXME: error handling (also in elf_analy.cc) */ if (!name) continue; @@ -165,28 +224,41 @@ static ht_view *htelfsymboltable_init(Bounds *b, File *file, ht_format_group *gr tt += ht_snprintf(tt, tt_end, "%04x ", i); - const char *bind = matchhash(ELF32_ST_BIND(sym.st_info), elf_st_bind); + const char *bind = matchhash(st_bind, elf_st_bind); if (bind) { tt += ht_snprintf(tt, tt_end, "%-8s ", bind); } else { - tt += ht_snprintf(tt, tt_end, "? (%d) ", ELF32_ST_BIND(sym.st_info)); + tt += ht_snprintf(tt, tt_end, "? (%d) ", st_bind); } - const char *type = matchhash(ELF32_ST_TYPE(sym.st_info), elf_st_type); + const char *type = matchhash(st_type, elf_st_type); if (type) { tt += ht_snprintf(tt, tt_end, "%-8s ", type); } else { - tt += ht_snprintf(tt, tt_end, "? (%d) ", ELF32_ST_TYPE(sym.st_info)); + tt += ht_snprintf(tt, tt_end, "? (%d) ", st_type); } - FileOfs so = elf_shared->sheaders.sheaders32[elf_shared->header32.e_shstrndx].sh_offset; - tt = tag_make_edit_dword(tt, tt_end, h+i*sizeof (ELF_SYMBOL32)+4, elf_bigendian ? tag_endian_big : tag_endian_little); - tt += ht_snprintf(tt, tt_end, " "); - tt = tag_make_edit_dword(tt, tt_end, h+i*sizeof (ELF_SYMBOL32)+8, elf_bigendian ? tag_endian_big : tag_endian_little); - tt += ht_snprintf(tt, tt_end, " "); + FileOfs so; + if (elf32) { + so = elf_shared->sheaders.sheaders32[elf_shared->header32.e_shstrndx].sh_offset; + tt = tag_make_edit_dword(tt, tt_end, h + i*sizeof (ELF_SYMBOL32) + 4, + elf_bigendian ? tag_endian_big : tag_endian_little); + tt += ht_snprintf(tt, tt_end, " "); + tt = tag_make_edit_dword(tt, tt_end, h + i*sizeof (ELF_SYMBOL32) + 8, + elf_bigendian ? tag_endian_big : tag_endian_little); + tt += ht_snprintf(tt, tt_end, " "); + } else { + so = elf_shared->sheaders.sheaders64[elf_shared->header64.e_shstrndx].sh_offset; + tt = tag_make_edit_qword(tt, tt_end, h+i*sizeof (ELF_SYMBOL64) + 8, + elf_bigendian ? tag_endian_big : tag_endian_little); + tt += ht_snprintf(tt, tt_end, " "); + tt = tag_make_edit_qword(tt, tt_end, h+i*sizeof (ELF_SYMBOL64) + 16, + elf_bigendian ? tag_endian_big : tag_endian_little); + tt += ht_snprintf(tt, tt_end, " "); + } String s("?"); - switch (sym.st_shndx) { + switch (st_shndx) { case ELF_SHN_UNDEF: s.assign("*undefined"); break; @@ -197,8 +269,8 @@ static ht_view *htelfsymboltable_init(Bounds *b, File *file, ht_format_group *gr s.assign("*common"); break; default: - if (isValidELFSectionIdx(elf_shared, sym.st_shndx)) { - FileOfs no = elf_shared->sheaders.sheaders32[sym.st_shndx].sh_name; + if (isValidELFSectionIdx(elf_shared, st_shndx)) { + FileOfs no = elf32 ? elf_shared->sheaders.sheaders32[st_shndx].sh_name : elf_shared->sheaders.sheaders64[st_shndx].sh_name; file->seek(so + no); file->readStringz(s); } From 680a46fac85db395beab7c73b3802ddf825f8f98 Mon Sep 17 00:00:00 2001 From: seppel Date: Fri, 23 Nov 2012 03:15:16 +0000 Subject: [PATCH 46/53] *** empty log message *** --- ChangeLog | 3 + defreg.c | 358 +++++++++++++++++++++++------------------------ defreg.h | 2 +- htformat.cc | 96 +++++++++---- htformat.h | 2 + htreg.cc | 390 +++++++++++++++++++++++++++------------------------- htreg.h | 4 +- 7 files changed, 460 insertions(+), 395 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0fa9d7d..2e95e1e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5,6 +5,9 @@ version 2.0.22: - Fixed selection of nodes in call chain - Added ability to view/edit 64 bit symbols and relocation for ELFs (Thanks tecknicaltom) + - Added new option "editor/scroll offset" which determines how many + extra lines the cursor should be visible when scolling + (Thanks tecknicaltom) version 2.0.21: - [x86] AVX2 updates diff --git a/defreg.c b/defreg.c index 7a4ded3..e370cb7 100644 --- a/defreg.c +++ b/defreg.c @@ -1,7 +1,7 @@ /* generated by bin2c from ht.reg */ -char default_reg[1591] = { - 0x00,0x00,0x18,0x06,0x00,0x00,0x06,'/', +char default_reg[1605] = { + 0x00,0x00,0x18,' ', 0x00,0x00,0x06,'=', 0x00,0x1f,'R', 'E', 'G', 0x00,'D', 'A', 'T', '!', 'D', 'A', 'T', 0xc0,0x00,0x00, 0x00,0x06,'R', 'E', 'G', 0x10,0x00,0x00, @@ -19,185 +19,187 @@ char default_reg[1591] = { ')', 0xd5,0x01,0x02,0xe4,0x03,0x02,'c', 'o', 'n', 'f', 'i', 0x8c,0x09,'3', 'x', 0x00,0x03,'e', 'd', 'i', 't', 'o', 'r', - '.', 0xf5,0x00,0x04,0xd4,0x07,0x01,0x04, + '.', 0xf5,0x00,0x05,0xd4,0x07,0x01,0x04, 'E', 'O', 'F', 'l', 0x03,0x03,0x05,'<', 'E', 'O', 'F', '>', '`', 0x10,0x01,0x04, 'E', 'O', 'L', 0x85,0x02,'.', 't', 0x01, 0x09,0x03,'a', 'u', 't', 'o', ' ', 'i', 'n', 'd', 'e', 'n', 't', 'u', 0x02,0x03, - 'l', 0x11,'l', 0x1d,0x05,'t', 'a', 'b', - ' ', 's', 'i', 'z', 'e', 0xf1,0x02,0x08, - '`', 0x03,0x01,'m', 'i', 's', 'c', '`', - 0x02,'*', '!', 0x02,0x03,0xc5,0x0d,0x03, - 0xbc,0x14,0x03,' ', 'f', 'o', 'r', 'm', - 'a', '\'','-', 0x01,0x02,0xb4,'!', 0x04, - 'a', 't', 'u', 's', 'l', 'i', 'n', 0x94, - 0x09,0x0a,0x05,'%', 'a', ' ', '%', 'L', - ' ', '%', 't', ' ', '%', 'd', 0x00,'x', - 0x03,0x08,'v', 'f', 's', ' ', 'd', 'i', - 's', 'p', 'l', 'a', 'y', ')', 0xf4,0x00, - 0x00,0x07,0x05,'t', 'y', 'p', 'e', ',', - 'n', 'a', 'm', 'e', ':', '2', '0', '+', - ',', '|', ',', 'd', 'e', 's', 'c', ',', - '|', ',', 'b', 't', 0x12,0x04,',', '|', - ',', 'p', 'e', 'r', 'm', 'X', 0x01,0x03, - 'r', 'm', 't', 'i', 'm', 'e', '}', 0x08, - 0x01,0xe0,'2', '@', '4', '*', 0x80,0x02, - 0xe8,'!', 0x05,0x01,'a', 'n', 'a', 'l', - 'y', 's', 'e', '/', 0xad,0x04,0x01,0xc4, - 0x18,0x04,0x01,'d', 'e', 'f', 'a', 'u', - 'l', 0x8c,0x17,'*', 0x00,0x01,'}', '?', - 0x01,'d', '>', 0x01,'c', 'o', 'm', 'm', - '|', '$', 'D', '>', '`', 0x0e,0x02,0x00, - 0x00,0x00,0x07,0x08,'|', 0x02,0xfc,0x06, - '(', ']', 0x00,0x82,0x9c,0x02,0x02,'l', - 'a', 'b', 'e', 'l', '|', 'C', 0xd5,0x05, - 0x86,0x94,0x02,0x03,'n', 'u', 'm', 'b', - 'e', 'r', ')', 'Y', 0x00,0x03,0x98,0x02, - 0xc8,'F', '(', 0x0d,0x01,0x84,0xb8,0x02, - 0x0a,'y', 'm', 'b', 'o', 'l', '-', 'c', - 'h', 'a', 'r', 'a', 'c', 't', '+', 0xdd, - 0x00,0x83,0x8c,'2', 0x03,'g', 'e', 'n', - 'e', 'r', 'i', '/', 'Y', 0x06,0x0c,0xf0, - 0x1a,0x01,'b', 'l', 'a', 'c', 0x88,'M', - '*', 'I', 0x03,0x1b,0xb4,0x03,0x03,0x01, - 0x00,'b', 'o', 'd', 'y', ')', ')', 0x02, - 0x07,'t', '<', 0x0c,0x00,'b', 'u', 't', - 't', 'o', 'n', ' ', 'f', 'o', 'c', 'u', - 's', 'e', 'd', ')', 'z', 0x00,0x87,0x02, - 'x', 0x1d,0xd8,0x03,0x03,'s', 'h', 'a', - 'd', 'o', 'w', ')', 'u', 0x00,0x00,0x80, - 0x16,'\'','t', 0x00,0x03,'o', 'r', 't', - 'c', 'u', 't', '*', '|', 0x00,'*', 'r', - 0x01,'u', 'n', '0', 'y', 0x01,0x00,0x98, - 0x0b,0x01,'c', 'l', 'u', 's', '@', 0x1d, - '2', 0xf9,0x01,0x03,'x', 0x0f,0xfe,0x03, - 's', 'h', '/', 0x85,0x01,0x86,'+', 0x80, - 0x00,'3', 0x88,0x01,0x84,0x04,0x02,'f', - 'r', 'a', 'm', 'e', '1', 0x80,0x01,0xb8, - '9', 0xb4,0x03,0x01,'k', 'i', 'l', 'l', - '+', 0xb9,0x05,0x02,0x98,0x1b,0xb0,0x03, - 0x04,'m', 'o', 'v', 'e', '-', 'r', 'e', - 'h', 'Q', ')', 0x80,0x03,0xb4,'>', 0xa4, - 0x04,'2', 0xf0,0x01,0xb8,0x0b,0x07,'i', - 'n', 'p', 'u', 't', ' ', 'c', 'l', 'i', - 'p', 0x95,':', 's', '*', 0x00,0x01,0x98, - 'L', 0xa0,0x04,'0', 'y', 0x04,0x87,')', - 't', 0x00,0x03,'s', 'e', 'l', 'e', 'c', - 't', '1', 'p', 0x06,0xb0,0x07,'2', 0xf4, - 0x01,0xb8,0x07,0x01,'l', 'i', 's', 't', - 0xe7,0x1f,' ', '&', ' ', '2', 0x1c,0x01, - 0x98,0x0c,'-', 0x9e,0x00,'u', 'n', '1', - 0xa4,0x00,0xb4,'E', 0x84,0x05,'\'',0xc0, - 0x01,'5', 'L', 0x01,0x88,'?', '/', 0xa4, - 0x00,'3', 'T', 0x01,'p', 'e', 0x07,0x01, - 0x00,'s', 'c', 'r', 'o', 'l', 'l', 'b', - 'a', '*', 0xa2,0x0c,0x00,0x07,'|', '?', - 0x01,'t', 'e', 'x', 't', 0x7f,0x85,'a', - 'b', 'l', '+', 0xfd,0x03,0x07,0x88,';', - 0x94,0x03,'0', 0xed,0x04,0x00,'(', 'p', - 0x00,'1', ' ', 0x03,0xa8,0x0e,0x88,0x07, - '1', 'T', 0x09,0xb8,0x1c,'+', 't', 0x00, - '2', 0xdc,0x04,0xb4,'{', 0x98,0x04,'\'', - '4', 0x04,')', 'l', 0x07,'t', 'c', 0x02, - 0x00,0x01,'b', 'l', 'u', 0x90,0xa0,' ', - 0x03,'1', 0x0e,0x03,0x80,'1', 0xdc,'i', - '0', 'H', 0x03,' ', 0x1d,'0', 0x0e,0xb4, - 0x15,0xd0,0x0b,'3', 0xbc,0x02,' ', 0x1f, - '0', 0x0e,0xb0,'*', 0xf4,'u', '3', 0x88, - 0x01,0x94,'B', 0xbc,'e', '1', '|', 0x03, - ')', 0xbc,0x0d,'/', '0', 0x0e,'*', 0xa8, - 0x0d,' ', 's', '1', 0x0e,0x81,0x88,'U', - ' ', '"', '0', 0x0e,0x9c,'V', 0x80,'g', - 0xc7,'$', ' ', '&', ' ', '3', 0xd8,0x0c, - 0xb4,'E', 0x84,0x05,'\'',0xac,0x05,'4', - '0', 0x0e,0xac,'a', '/', 0xa4,0x00,'9', - 'T', 0x01,'2', '1', 0x0e,0x01,0x84,0x13, - 0x9b,']', 'd', 'i', 's', '.', '1', 0x0e, - 0x86,0x8c,'W', 0x94,0x03,0xdc,0x16,')', - '(', 0x0c,')', 'p', 0x00,'1', '1', 0x0e, - 0x01,'(', 0xe8,0x00,'1', '1', 0x0e,0x00, - '0', 't', 0x00,'2', '0', 0x0e,')', 0x98, - 0x00,'\'','4', 0x04,')', 0x04,0x02,'l', - 0xa1,0x03,0x00,0x01,'c', 'y', 'a', 'n', - '.', '8', '#', '6', 'd', 0x1c,0xb0,'&', - 0xdc,'e', '0', 'H', 0x03,' ', 0x7f,'0', - 0x0e,' ', 0x1f,'e', 0x1c,0x87,' ', '=', - '0', 0x0e,'r', 0xa3,0x01,0x00,0xb8,'e', - ' ', 0xa3,'d', 0x1c,0xb4,'E', '/', 0x88, - 0x0d,'1', 0xb5,0x0b,0x87,0x98,'h', '/', - 0xa4,0x00,'3', '0', 0x0e,0xb4,0x0a,'2', - '0', 0x0e,0xb0,0x7f,0x98,'m', '1', '0', - 0x0e,')', 0x00,0x1b,'0', 0xe4,0x0a,0xa8, - '/', 0x88,0x07,'1', 'x', 0x02,'*', 't', - 0x00,'1', 0xbc,'%', 0x94,'B', 0xac,0x07, - 0xd4,0x03,'2', '0', 0x0e,')', 0xbc,0x0f, - '2', '0', 0x0e,'l', 0x0c,0x06,0x00,0x02, - 'd', 'e', 's', 'k', 't', 'o', 'p', '}', - 'q', 0x05,'$', 0xcc,'*', 0x06,0x00,0x00, - 0x00,0x02,'d', 'i', 'a', 'l', 'o', '#', - 0xf0,'3', 0x02,0x05,'g', 'r', 'a', 'y', - 0x8c,0xca,0x80,0x01,'-', 0x90,'/', '7', - 0xd8,0x0e,0x9c,0xb0,' ', 0x00,0xdf,0xd8, - 0x0e,'#', '$', '#', 0x88,'l', 0xd8,'_', - '6', 0x0c,0x1d,0xa0,'l', 0x84,0x05,'\'', - 0xa0,0x0a,'4', 0x0c,0x1d,' ', 'C', 0xd9, - 0x0e,0x80,'(', 't', 0x0d,0xdc,0x16,'*', - 0x04,0x1b,'(', 'p', 0x00,'1', 0xd8,0x0e, - '~', 0xdb,0x01,0x00,'+', '`', 0x0e,')', - 0xec,0x00,'$', 0xec,'\'','+', 't', 0x00, - '3', 0xd8,0x0e,'(', 0x88,0x01,'\'','4', - 0x04,')', 0x14,0x01,0x99,'v', 0x01,'q', - 'q', '2', 'p', 'v', ' ', 0x03,'D', '+', - '$', 0x00,'/', ' ', 0x98,'4', 0x0e,0x95, - 0x8f,0x00,';', 'D', '+', 0x94,0xb9,'6', - 'D', '+', 'f', '&', 0x01,0x00,0xb4,0x03, - ' ', '2', 'D', '+', 0xb8,0x0b,' ', 0x80, - 0x10,0x1d,' ', 'x', '4', 0x0e,0xbc,'\'', - 0x98,'b', ' ', '.', 0x10,0x1d,0x88,0x1e, - 0x80,0x0b,'1', 'E', '+', 0x04,'(', 0x98, - 0x0d,0xf4,0x03,'2', '4', 0x0e,')', 0x98, - 0x00,'7', '4', 0x0e,0x01,0x02,'h', 'e', - 'l', 0xa4,0xe8,'#', 'h', '+', 'c', 0xe8, - 'k', 'e', 'y', '\'',0xe0,'M', '(', 'X', - 0x1d,0x01,'m', 'e', 'n', 'u', 'p', 'v', - 0x91,0xea,'2', '|', 'Z', 0x05,0x02,'s', - 'p', 'e', 'c', 'i', 'a', 'l', 0x94,0x02, - '\'',0xf7,0x00,'w', 'i', 'n', '"', 0x8c, - 'G', 0x01,'R', 'E', 'G', 0x05,'#', 0xe4, - ':', '"', 0xc0,'6', 0x03,'s', 'y', 'n', - 't', 'a', 'x', '|', 0x04,'*', 0xc8,0x0f, - '\'',0x10,'M', '/', '$', 'J', '\'','d', - 0x00,'&', 0x98,'L', '-', 0xe9,0x1e,0x0b, - '&', ',', 'J', '6', 0x8e,'K', 0x01,0x00, - '6', 0xe0,'M', 0x03,'f', 'l', 'o', 'a', - 't', ' ', '/', 'A', 'M', 0x81,0x85,'*', - 'i', '"', 'O', 'S', 'i', 'f', 'i', '+', - 0x10,'G', 0xa8,0x9f,0x04,'i', 'n', 't', - 'e', 'g', 'e', 'r', '0', 0xe5,0x00,0x85, - 0x84,0x07,0x01,'m', 'e', 't', 'a', ')', - 0xa0,0x13,0xb8,0x09,0x06,'p', 'r', 'e', - 'p', 'r', 'o', 'c', 'e', 's', '+', 0xc0, - 'F', 0x9c,0x05,0x03,'r', 'e', 's', 'e', - 'r', 'v', '+', '0', 'B', '$', 0xbc,',', - '/', 'L', 'O', '"', 0xcb,'N', 0x01,0x00, - 's', '#', 'L', 'O', ')', 0x84,0x01,0xb4, - 0x05,0x06,'w', 'h', 'i', 't', 'e', 's', - 'p', 'a', 'c', '#', 'L', 'Y', 's', '2', - 0x00,0x00,0x00,'`', 0x16,0x03,0x00,0x01, - 't', 'a', 'g', 's', '7', 0xc4,0x05,'5', - ']', 0x05,0x09,0xfc,'*', '"', 0x84,'X', - 0x01,'-', 't', 'a', 'g', ')', 0xc0,0x01, - '$', '$', 'J', 0xe0,0x03,0x05,' ', 'c', - 'u', 'r', 's', 'o', 'r', ' ', '|', 0x01, - ')', 0x92,0x00,0x87,0x04,'"', 0xb8,'E', - 'p', 0x02,'t', 0x07,0xf0,0x04,0xb4,0xcd, - '?', 0x98,0x00,'2', 0x8c,0x0a,0xb8,0x1c, - '\'','C', 0x01,'m', 'o', 'd', 'x', '3', - '*', 0x80,'Q', '$', 0xcc,'S', '\'',0x84, - 0x00,0xac,0x0d,'+', 'a', 0x05,0x80,'#', - '@', '\'','@', 0x03,'l', 0x12,'*', 0x14, - 0x02,0x84,'1', 0xdc,0x02,0xec,0x15,'1', - 0xd8,0x1c,0x80,0xb4,'-', 0x98,0x00,'2', - 0xae,0x02,0x00,0x03,0x11,0x00,0x00 + 'l', 0x11,'l', 0x1d,0x09,'s', 'c', 'r', + 'o', 'l', 'l', ' ', 'o', 'f', 'f', 's', + 'e', '\'','d', 0x00,'t', 0x03,0x06,0x03, + 't', 'a', 'b', ' ', 's', 'i', 'z', 'e', + 0xf9,0x05,0x08,'h', 0x06,0x01,'m', 'i', + 's', 'c', '`', 0x02,'*', 0x89,0x02,0x03, + 0xcd,0x10,0x03,0xa4,0x18,0x03,' ', 'f', + 'o', 'r', 'm', 'a', '\'','-', 0x01,0x02, + 0xbc,'$', 0x04,'a', 't', 'u', 's', 'l', + 'i', 'n', 0x94,0x09,0x0a,0x05,'%', 'a', + ' ', '%', 'L', ' ', '%', 't', ' ', '%', + 'd', 0x00,'x', 0x03,0x08,'v', 'f', 's', + ' ', 'd', 'i', 's', 'p', 'l', 'a', 'y', + ')', 0xf4,0x00,0x00,0x07,0x05,'t', 'y', + 'p', 'e', ',', 'n', 'a', 'm', 'e', ':', + '2', '0', '+', ',', '|', ',', 'd', 'e', + 's', 'c', ',', '|', ',', 'b', 't', 0x12, + 0x04,',', '|', ',', 'p', 'e', 'r', 'm', + 'X', 0x01,0x03,'r', 'm', 't', 'i', 'm', + 'e', '}', 0x08,0x01,0xe8,'5', 'H', '7', + '*', 0x81,0x02,0x04,0xc0,0x14,0x05,0x01, + 'a', 'n', 'a', 'l', 'y', 's', 'e', '/', + 0x15,0x05,0x01,0xe0,0x04,0x03,'d', 'e', + 'f', 'a', 'u', 'l', 0x8c,0x17,'*', 0x00, + 0x01,'e', 'C', 0x01,'l', 'A', 0x01,'c', + 'o', 'm', 'm', 'd', '(', 'L', 'A', '`', + 0x0e,0x02,0x00,0x00,0x00,0x07,0x08,'|', + 0x02,0xfc,0x06,'(', ']', 0x00,0x82,0x9c, + 0x02,0x02,'l', 'a', 'b', 'e', 'l', 'd', + 'G', 0xd5,0x05,0x86,0x94,0x02,0x03,'n', + 'u', 'm', 'b', 'e', 'r', ')', 'Y', 0x00, + 0x03,0x98,0x02,0xd0,'I', '(', 0x0d,0x01, + 0x84,0xb8,0x02,0x0a,'y', 'm', 'b', 'o', + 'l', '-', 'c', 'h', 'a', 'r', 'a', 'c', + 't', '+', 0xdd,0x00,0x83,0x8c,'2', 0x03, + 'g', 'e', 'n', 'e', 'r', 'i', '/', 'Y', + 0x06,0x0c,0xf0,0x1a,0x01,'b', 'l', 'a', + 'c', 0x90,'P', '*', 'I', 0x03,0x1b,0xb4, + 0x03,0x03,0x01,0x00,'b', 'o', 'd', 'y', + ')', ')', 0x02,0x07,'t', '<', 0x0c,0x00, + 'b', 'u', 't', 't', 'o', 'n', ' ', 'f', + 'o', 'c', 'u', 's', 'e', 'd', ')', 'z', + 0x00,0x87,0x02,'x', 0x1d,0xd8,0x03,0x03, + 's', 'h', 'a', 'd', 'o', 'w', ')', 'u', + 0x00,0x00,0x80,0x16,'\'','t', 0x00,0x03, + 'o', 'r', 't', 'c', 'u', 't', '*', '|', + 0x00,'*', 'r', 0x01,'u', 'n', '0', 'y', + 0x01,0x00,0x98,0x0b,0x01,'c', 'l', 'u', + 's', '@', 0x1d,'2', 0xf9,0x01,0x03,'x', + 0x0f,0xfe,0x03,'s', 'h', '/', 0x85,0x01, + 0x86,'+', 0x80,0x00,'3', 0x88,0x01,0x84, + 0x04,0x02,'f', 'r', 'a', 'm', 'e', '1', + 0x80,0x01,0xb8,'9', 0xb4,0x03,0x01,'k', + 'i', 'l', 'l', '+', 0xb9,0x05,0x02,0x98, + 0x1b,0xb0,0x03,0x04,'m', 'o', 'v', 'e', + '-', 'r', 'e', 'h', 'Q', ')', 0x80,0x03, + 0xb4,'>', 0xa4,0x04,'2', 0xf0,0x01,0xb8, + 0x0b,0x07,'i', 'n', 'p', 'u', 't', ' ', + 'c', 'l', 'i', 'p', 0x95,':', 's', '*', + 0x00,0x01,0x98,'L', 0xa0,0x04,'0', 'y', + 0x04,0x87,')', 't', 0x00,0x03,'s', 'e', + 'l', 'e', 'c', 't', '1', 'p', 0x06,0xb0, + 0x07,'2', 0xf4,0x01,0xb8,0x07,0x01,'l', + 'i', 's', 't', 0xe7,0x1f,' ', '&', ' ', + '2', 0x1c,0x01,0x98,0x0c,'-', 0x9e,0x00, + 'u', 'n', '1', 0xa4,0x00,0xb4,'E', 0x84, + 0x05,'\'',0xc0,0x01,'5', 'L', 0x01,0x88, + '?', '/', 0xa4,0x00,'3', 'T', 0x01,'r', + 'e', 0x01,0x00,0xa6,0x93,'b', 'a', '*', + 0xa2,0x0c,0x00,0x07,'|', '?', 0x01,'t', + 'e', 'x', 't', 0x7f,0x85,'a', 'b', 'l', + '+', 0xfd,0x03,0x07,0x88,';', 0x94,0x03, + '0', 0xed,0x04,0x00,'(', 'p', 0x00,'1', + ' ', 0x03,0xa8,0x0e,0x88,0x07,'1', 'T', + 0x09,0xb8,0x1c,'+', 't', 0x00,'2', 0xdc, + 0x04,0xb4,'{', 0x98,0x04,'\'','4', 0x04, + ')', 'l', 0x07,'t', 'c', 0x02,0x00,0x01, + 'b', 'l', 'u', 0x90,0xa0,' ', 0x03,'1', + 0x0e,0x03,0x80,'1', 0xdc,'i', '0', 'H', + 0x03,' ', 0x1d,'0', 0x0e,0xb4,0x15,0xd0, + 0x0b,'3', 0xbc,0x02,' ', 0x1f,'0', 0x0e, + 0xb0,'*', 0xf4,'u', '3', 0x88,0x01,0x94, + 'B', 0xbc,'e', '1', '|', 0x03,')', 0xbc, + 0x0d,'/', '0', 0x0e,'*', 0xa8,0x0d,' ', + 's', '1', 0x0e,0x81,0x88,'U', ' ', '"', + '0', 0x0e,0x9c,'V', 0x80,'g', 0xc7,'$', + ' ', '&', ' ', '3', 0xd8,0x0c,0xb4,'E', + 0x84,0x05,'\'',0xac,0x05,'4', '0', 0x0e, + 0xac,'a', '/', 0xa4,0x00,'9', 'T', 0x01, + '2', '1', 0x0e,0x01,0x84,0x13,0x9b,']', + 'd', 'i', 's', '.', '1', 0x0e,0x86,0x8c, + 'W', 0x94,0x03,0xdc,0x16,')', '(', 0x0c, + ')', 'p', 0x00,'1', '1', 0x0e,0x01,'(', + 0xe8,0x00,'1', '1', 0x0e,0x00,'0', 't', + 0x00,'2', '0', 0x0e,')', 0x98,0x00,'\'', + '4', 0x04,')', 0x04,0x02,'l', 0xa1,0x03, + 0x00,0x01,'c', 'y', 'a', 'n', '.', '8', + '#', '6', 'd', 0x1c,0xb0,'&', 0xdc,'e', + '0', 'H', 0x03,' ', 0x7f,'0', 0x0e,' ', + 0x1f,'e', 0x1c,0x87,' ', '=', '0', 0x0e, + 'r', 0xa3,0x01,0x00,0xb8,'e', ' ', 0xa3, + 'd', 0x1c,0xb4,'E', '/', 0x88,0x0d,'1', + 0xb5,0x0b,0x87,0x98,'h', '/', 0xa4,0x00, + '3', '0', 0x0e,0xb4,0x0a,'2', '0', 0x0e, + 0xb0,0x7f,0x98,'m', '1', '0', 0x0e,')', + 0x00,0x1b,'0', 0xe4,0x0a,0xa8,'/', 0x88, + 0x07,'1', 'x', 0x02,'*', 't', 0x00,'1', + 0xbc,'%', 0x94,'B', 0xac,0x07,0xd4,0x03, + '2', '0', 0x0e,')', 0xbc,0x0f,'2', '0', + 0x0e,'l', 0x0c,0x06,0x00,0x02,'d', 'e', + 's', 'k', 't', 'o', 'p', '}', 'q', 0x05, + '$', 0xcc,'*', 0x06,0x00,0x00,0x00,0x02, + 'd', 'i', 'a', 'l', 'o', '#', 'X', '4', + 0x02,0x05,'g', 'r', 'a', 'y', 0x8c,0xca, + 0x80,0x01,'-', 0x90,'/', '7', 0xd8,0x0e, + 0x9c,0xb0,' ', 0x00,0xdf,0xd8,0x0e,'#', + '$', '#', 0x88,'l', 0xd8,'_', '6', 0x0c, + 0x1d,0xa0,'l', 0x84,0x05,'\'',0xa0,0x0a, + '4', 0x0c,0x1d,' ', 'C', 0xd9,0x0e,0x80, + '(', 't', 0x0d,0xdc,0x16,'*', 0x04,0x1b, + '(', 'p', 0x00,'1', 0xd8,0x0e,'~', 0xdb, + 0x01,0x00,'+', '`', 0x0e,')', 0xec,0x00, + '$', 0xec,'\'','+', 't', 0x00,'3', 0xd8, + 0x0e,'(', 0x88,0x01,'\'','4', 0x04,')', + 0x14,0x01,0x99,'v', 0x01,'q', 'q', '2', + 'p', 'v', ' ', 0x03,'D', '+', '$', 0x00, + '/', ' ', 0x98,'4', 0x0e,0x95,0x8f,0x00, + ';', 'D', '+', 0x94,0xb9,'6', 'D', '+', + 'f', '&', 0x01,0x00,0xb4,0x03,' ', '2', + 'D', '+', 0xb8,0x0b,' ', 0x80,0x10,0x1d, + ' ', 'x', '4', 0x0e,0xbc,'\'',0x98,'b', + ' ', '.', 0x10,0x1d,0x88,0x1e,0x80,0x0b, + '1', 'E', '+', 0x04,'(', 0x98,0x0d,0xf4, + 0x03,'2', '4', 0x0e,')', 0x98,0x00,'7', + '4', 0x0e,0x01,0x02,'h', 'e', 'l', 0xa4, + 0xe8,'#', 'h', '+', 'c', 0xe8,'k', 'e', + 'y', '\'',0xe0,'M', '(', 'X', 0x1d,0x01, + 'm', 'e', 'n', 'u', 'p', 'v', 0x91,0xea, + '2', '|', 'Z', 0x05,0x02,'s', 'p', 'e', + 'c', 'i', 'a', 'l', 0x94,0x02,'\'',0xf7, + 0x00,'w', 'i', 'n', '"', 0x8c,'G', 0x01, + 'R', 'E', 'G', 0x05,'#', 0xe4,':', '"', + 0xc0,'6', 0x03,'s', 'y', 'n', 't', 'a', + 'x', '|', 0x04,'*', 0xc8,0x0f,'\'',0x10, + 'M', '/', '$', 'J', '\'','d', 0x00,'&', + 0x98,'L', '-', 0xe9,0x1e,0x0b,'&', ',', + 'J', '6', 0x8e,'K', 0x01,0x00,'6', 0xe0, + 'M', 0x03,'f', 'l', 'o', 'a', 't', ' ', + '/', 'A', 'M', 0x81,0x85,'*', 'i', '"', + 0xb7,'S', 'i', 'f', 'i', '+', 0x10,'G', + 0xa8,0x9f,0x04,'i', 'n', 't', 'e', 'g', + 'e', 'r', '0', 0xe5,0x00,0x85,0x84,0x07, + 0x01,'m', 'e', 't', 'a', ')', 0xa0,0x13, + 0xb8,0x09,0x06,'p', 'r', 'e', 'p', 'r', + 'o', 'c', 'e', 's', '+', 0xc0,'F', 0x9c, + 0x05,0x03,'r', 'e', 's', 'e', 'r', 'v', + '+', '0', 'B', '$', 0xbc,',', '/', 'L', + 'O', '"', 0xcb,'N', 0x01,0x00,'s', '#', + 'L', 'O', ')', 0x84,0x01,0xb4,0x05,0x06, + 'w', 'h', 'i', 't', 'e', 's', 'p', 'a', + 'c', '#', 0xb4,'Y', 's', '2', 0x00,0x00, + 0x00,'`', 0x16,0x03,0x00,0x01,'t', 'a', + 'g', 's', '7', 0xc4,0x05,'5', ']', 0x05, + 0x09,0xfc,'*', '"', 0xec,'X', 0x01,'-', + 't', 'a', 'g', ')', 0xc0,0x01,'$', '$', + 'J', 0xe0,0x03,0x05,' ', 'c', 'u', 'r', + 's', 'o', 'r', ' ', '|', 0x01,')', 0x92, + 0x00,0x87,0x04,'"', 0xb8,'E', 'p', 0x02, + 't', 0x07,0xf0,0x04,0xb4,0xcd,'?', 0x98, + 0x00,'2', 0x8c,0x0a,0xb8,0x1c,'\'','C', + 0x01,'m', 'o', 'd', 'x', '3', '*', 0x80, + 'Q', '$', 0xcc,'S', '\'',0x84,0x00,0xac, + 0x0d,'+', 'a', 0x05,0x80,'#', '@', '\'', + '@', 0x03,'l', 0x12,'*', 0x14,0x02,0x84, + '1', 0xdc,0x02,0xec,0x15,'1', 0xd8,0x1c, + 0x80,0xb4,'-', 0x98,0x00,'2', 0xae,0x02, + 0x00,0x03,0x11,0x00,0x00 }; diff --git a/defreg.h b/defreg.h index 89c3e61..b8a10b3 100644 --- a/defreg.h +++ b/defreg.h @@ -5,6 +5,6 @@ extern #ifdef __cplusplus "C" #endif -char default_reg[1591]; +char default_reg[1605]; #endif /* __DEFREG_H */ diff --git a/htformat.cc b/htformat.cc index bc4e4a4..97f4e6c 100644 --- a/htformat.cc +++ b/htformat.cc @@ -906,6 +906,8 @@ void ht_uformat_viewer::init(Bounds *b, const char *desc, int caps, File *file, search_caps = SEARCHMODE_VREGEX; uf_initialized = false; + + config_changed(); } void ht_uformat_viewer::done() @@ -1097,6 +1099,12 @@ void ht_uformat_viewer::complete_init() uf_initialized = true; } +void ht_uformat_viewer::config_changed() +{ + scroll_offset = get_config_dword("editor/scroll offset", 3); + ht_view::config_changed(); +} + int ht_uformat_viewer::cursor_left() { if (cursor.tag_idx) { @@ -1132,6 +1140,7 @@ int ht_uformat_viewer::cursor_right() int ht_uformat_viewer::cursor_up(int n) { + int scrolloff = MIN(scroll_offset, size.h/2); switch (cursor_state) { case cursor_state_invisible: case cursor_state_visible: { @@ -1176,7 +1185,7 @@ int ht_uformat_viewer::cursor_up(int n) cursor_ypos = c_ypos; cursor.tag_idx = c_tag_idx; cursor.tag_group = c_tag_group; - if (cursor_ypos <= -1) scroll_up(-cursor_ypos); + if (cursor_ypos <= scrolloff-1) scroll_up(-cursor_ypos+scrolloff); update_misc_info(); update_visual_info(); if (edit()) update_micropos(); @@ -1232,7 +1241,7 @@ int ht_uformat_viewer::cursor_up(int n) cursor_ypos = c_ypos; cursor.tag_idx = c_tag_idx; cursor.tag_group = c_tag_group; - if (-cursor_ypos+n-nc-1 > 0) scroll_up(-cursor_ypos+n-nc-1); + if (-cursor_ypos+n-nc-1+scrolloff > 0) scroll_up(-cursor_ypos+n-nc-1+scrolloff); update_misc_info(); update_visual_info(); if (edit()) update_micropos(); @@ -1254,6 +1263,7 @@ int ht_uformat_viewer::cursor_up(int n) int ht_uformat_viewer::cursor_down(int n) { + int scrolloff = MIN(scroll_offset, size.h/2); switch (cursor_state) { case cursor_state_invisible: case cursor_state_visible: { @@ -1297,7 +1307,7 @@ int ht_uformat_viewer::cursor_down(int n) cursor_ypos = c_ypos; cursor.tag_idx = c_tag_idx; cursor.tag_group = c_tag_group; - if (cursor_ypos >= size.h) scroll_down(cursor_ypos-size.h+1); + if (cursor_ypos >= size.h-(scrolloff+1)) scroll_down(cursor_ypos-size.h+scrolloff+1); update_misc_info(); update_visual_info(); if (edit()) update_micropos(); @@ -1354,7 +1364,7 @@ int ht_uformat_viewer::cursor_down(int n) cursor_ypos=c_ypos; cursor.tag_idx=c_tag_idx; cursor.tag_group=c_tag_group; - if (cursor_ypos-size.h+1>0) scroll_down(cursor_ypos-size.h+1); + if (cursor_ypos-size.h+1+scrolloff>0) scroll_down(cursor_ypos-size.h+1+scrolloff); update_misc_info(); update_visual_info(); if (edit()) update_micropos(); @@ -3818,45 +3828,75 @@ void ht_uformat_viewer::sendsubmsg(htmsg *msg) bool ht_uformat_viewer::set_cursor(uformat_viewer_pos p) { + int scrolloff = MIN(scroll_offset, size.h/2); cursorline_dirty(); uformat_viewer_pos t = top; int ty = 0; -// bool hasnext = true; -/* test if cursor is already on screen */ -// if (cursor_state == cursor_state_visible) { + + bool on_screen = false; + bool half_screen_above = false; + bool half_screen_below = false; + + if (cursor_state != cursor_state_visible) { + return false; + } + + while (ty < scrolloff && next_line(&t, 1)) { + ty++; + } + while (prev_line(&t, 1) && ty-- > -size.h/2) { + if (t.sub == p.sub && compeq_line_id(t.line_id, p.line_id)) { + half_screen_above = true; + break; + } + } + + if (!half_screen_above) { + t = top; + ty = 0; do { -// if (compeq_viewer_pos(&t, &p)) { - if ((t.sub == p.sub) && compeq_line_id(t.line_id, p.line_id)) { - cursor = p; - if (p.tag_group != -1) cursor.tag_group = p.tag_group; - adjust_cursor_group(); - if (p.tag_idx !=-1) cursor.tag_idx = p.tag_idx; - adjust_cursor_idx(); - cursor_ypos = ty; - update_misc_info(); - update_visual_info(); - check_cursor_visibility(); - cursorline_dirty(); - dirtyview(); - return true; + if (t.sub == p.sub && compeq_line_id(t.line_id, p.line_id)) { + if (ty < size.h - scrolloff) { + on_screen = true; + } else { + half_screen_below = true; + } + break; } - } while ((/*hasnext = */next_line(&t, 1)) && (ty++ < size.h-1)); -// } -/**/ + } while (next_line(&t, 1) && ty++ < size.h*3/2); + } char line[1024]; char *e; p.sub->getline(line, sizeof line, p.line_id); e = tag_get_selectable_tag(line, 0, 0); - if (!e) return 0; + if (!e) return false; + cursor = p; if (p.tag_group != -1) cursor.tag_group = p.tag_group; adjust_cursor_group(); if (p.tag_idx != -1) cursor.tag_idx = p.tag_idx; adjust_cursor_idx(); - cursor_ypos=0; -// cursor_ypos=center_view(sub, id1, id2); - top = p; + + if (on_screen) { + cursor_ypos = ty; + } else if (half_screen_above) { + cursor_ypos = scrolloff; + top = p; + ty = 0; + while (ty < scrolloff && prev_line(&top, 1)) { + ty++; + } + } else if (half_screen_below) { + cursor_ypos = size.h - 1; + while (next_line(&top, 1) && (ty-- > size.h-scrolloff)) {} + } else { + ty = 0; + top = p; + while (prev_line(&top, 1) && (ty++ < size.h/2-1)) { } + cursor_ypos=size.h/2-1; + } + update_misc_info(); update_visual_info(); check_cursor_visibility(); diff --git a/htformat.h b/htformat.h index 437c7b6..571ea4f 100644 --- a/htformat.h +++ b/htformat.h @@ -325,6 +325,7 @@ class ht_uformat_viewer: public ht_format_viewer { bool uf_initialized; bool isdirty_cursor_line; + int scroll_offset; /* overwritten */ virtual const char *func(uint i, bool execute); @@ -396,6 +397,7 @@ class ht_uformat_viewer: public ht_format_viewer { void init(Bounds *b, const char *desc, int caps, File *file, ht_format_group *format_group); virtual void done(); /* overwritten */ + virtual void config_changed(); virtual void clear_viewer_pos(viewer_pos *p); virtual void draw(); virtual bool get_current_offset(FileOfs *offset); diff --git a/htreg.cc b/htreg.cc index ba142dc..e012c25 100644 --- a/htreg.cc +++ b/htreg.cc @@ -27,6 +27,7 @@ #include "htctrl.h" #include "htdialog.h" #include "htiobox.h" +#include "htpal.h" #include "htreg.h" #include "log.h" #include "snprintf.h" @@ -48,6 +49,8 @@ ht_registry *registry; #define ATOM_HT_CREATE_EMPTY_STRING MAGIC32("REG\x23") #define ATOM_HT_CREATE_EMPTY_RAW MAGIC32("REG\x24") +#define GENERATE_NEW_REGISTRY 0 + /* * CLASS ht_registry_data */ @@ -366,7 +369,7 @@ void ht_registry_node_type_desc::store(ObjectStream &f) const ht_registry_data *create_empty_palette_entry(); void ht_registry::init() { -#if 0 +#if GENERATE_NEW_REGISTRY // build registry root AVLTree *s = new AVLTree(true); root = new ht_registry_node(RNT_SUBDIR, "/", new ht_registry_data_stree(s)); @@ -377,13 +380,14 @@ void ht_registry::init() AVLTree *config_misc = new AVLTree(true); AVLTree *config_editor = new AVLTree(true); config->insert(new ht_registry_node(RNT_SUBDIR, "misc", new ht_registry_data_stree(config_misc))); - config_misc->insert(new ht_registry_node(RNT_DWORD, "config format", new ht_registry_data_dword(1))); + config_misc->insert(new ht_registry_node(RNT_DWORD, "config format", new ht_registry_data_dword(2))); config_misc->insert(new ht_registry_node(RNT_STRING, "statusline", new ht_registry_data_string("%a %L %t %d"))); config_misc->insert(new ht_registry_node(RNT_STRING, "vfs display format", new ht_registry_data_string("type,name:20+,|,desc,|,bsize,|,perm,|,rmtime"))); config->insert(new ht_registry_node(RNT_SUBDIR, "editor", new ht_registry_data_stree(config_editor))); config_editor->insert(new ht_registry_node(RNT_STRING, "EOF", new ht_registry_data_string(""))); config_editor->insert(new ht_registry_node(RNT_STRING, "EOL", new ht_registry_data_string("."))); config_editor->insert(new ht_registry_node(RNT_DWORD, "auto indent", new ht_registry_data_dword(1))); + config_editor->insert(new ht_registry_node(RNT_DWORD, "scroll offset", new ht_registry_data_dword(3))); config_editor->insert(new ht_registry_node(RNT_DWORD, "tab size", new ht_registry_data_dword(8))); AVLTree *palette_analyser = new AVLTree(true); @@ -393,12 +397,12 @@ void ht_registry::init() palette->insert(new ht_registry_node(RNT_SUBDIR, "analyser", new ht_registry_data_stree(palette_analyser))); AVLTree *analyser_default = new AVLTree(true); palette_analyser->insert(new ht_registry_node(RNT_SUBDIR, "default", new ht_registry_data_stree(analyser_default))); - analyser_default->insert(new ht_registry_node(256, "default", create_empty_palette_entry())); - analyser_default->insert(new ht_registry_node(256, "comment", create_empty_palette_entry())); - analyser_default->insert(new ht_registry_node(256, "label", create_empty_palette_entry())); - analyser_default->insert(new ht_registry_node(256, "number", create_empty_palette_entry())); - analyser_default->insert(new ht_registry_node(256, "string", create_empty_palette_entry())); - analyser_default->insert(new ht_registry_node(256, "symbol-character", create_empty_palette_entry())); + analyser_default->insert(new ht_registry_node(256, "default", new palette_entry(0, 33288))); + analyser_default->insert(new ht_registry_node(256, "comment", new palette_entry(0, 1800))); + analyser_default->insert(new ht_registry_node(256, "label", new palette_entry(0, 34312))); + analyser_default->insert(new ht_registry_node(256, "number", new palette_entry(0, 776))); + analyser_default->insert(new ht_registry_node(256, "string", new palette_entry(0, 33800))); + analyser_default->insert(new ht_registry_node(256, "symbol-character", new palette_entry(0, 33544))); palette->insert(new ht_registry_node(RNT_SUBDIR, "generic", new ht_registry_data_stree(palette_generic))); AVLTree *palette_generic_black = new AVLTree(true); @@ -419,179 +423,179 @@ void ht_registry::init() palette_generic->insert(new ht_registry_node(RNT_SUBDIR, "gray", new ht_registry_data_stree(palette_generic_gray))); palette_generic->insert(new ht_registry_node(RNT_SUBDIR, "gray2", new ht_registry_data_stree(palette_generic_gray2))); // black - palette_generic_black->insert(new ht_registry_node(256, "body", create_empty_palette_entry())); - palette_generic_black->insert(new ht_registry_node(256, "text focused", create_empty_palette_entry())); - palette_generic_black->insert(new ht_registry_node(256, "text unfocused", create_empty_palette_entry())); - palette_generic_black->insert(new ht_registry_node(256, "text shortcut", create_empty_palette_entry())); - palette_generic_black->insert(new ht_registry_node(256, "text shortcut selected", create_empty_palette_entry())); - palette_generic_black->insert(new ht_registry_node(256, "text selected", create_empty_palette_entry())); - palette_generic_black->insert(new ht_registry_node(256, "text disabled", create_empty_palette_entry())); - palette_generic_black->insert(new ht_registry_node(256, "frame focused", create_empty_palette_entry())); - palette_generic_black->insert(new ht_registry_node(256, "frame unfocused", create_empty_palette_entry())); - palette_generic_black->insert(new ht_registry_node(256, "frame move-resize", create_empty_palette_entry())); - palette_generic_black->insert(new ht_registry_node(256, "frame killer", create_empty_palette_entry())); - palette_generic_black->insert(new ht_registry_node(256, "scrollbar", create_empty_palette_entry())); - palette_generic_black->insert(new ht_registry_node(256, "input focused", create_empty_palette_entry())); - palette_generic_black->insert(new ht_registry_node(256, "input unfocused", create_empty_palette_entry())); - palette_generic_black->insert(new ht_registry_node(256, "input selected", create_empty_palette_entry())); - palette_generic_black->insert(new ht_registry_node(256, "input clip-chars", create_empty_palette_entry())); - palette_generic_black->insert(new ht_registry_node(256, "button focused", create_empty_palette_entry())); - palette_generic_black->insert(new ht_registry_node(256, "button unfocused", create_empty_palette_entry())); - palette_generic_black->insert(new ht_registry_node(256, "button shadow", create_empty_palette_entry())); - palette_generic_black->insert(new ht_registry_node(256, "button shortcut", create_empty_palette_entry())); - palette_generic_black->insert(new ht_registry_node(256, "list focused & selected", create_empty_palette_entry())); - palette_generic_black->insert(new ht_registry_node(256, "list focused & unselected", create_empty_palette_entry())); - palette_generic_black->insert(new ht_registry_node(256, "list unfocused & selected", create_empty_palette_entry())); - palette_generic_black->insert(new ht_registry_node(256, "list unfocused & unselected", create_empty_palette_entry())); - palette_generic_black->insert(new ht_registry_node(256, "cluster focused", create_empty_palette_entry())); - palette_generic_black->insert(new ht_registry_node(256, "cluster unfocused", create_empty_palette_entry())); - palette_generic_black->insert(new ht_registry_node(256, "cluster shortcut", create_empty_palette_entry())); + palette_generic_black->insert(new ht_registry_node(256, "body", new palette_entry(0, 1792))); + palette_generic_black->insert(new ht_registry_node(256, "text focused", new palette_entry(0, 3))); + palette_generic_black->insert(new ht_registry_node(256, "text unfocused", new palette_entry(0, 8))); + palette_generic_black->insert(new ht_registry_node(256, "text shortcut", new palette_entry(0, 1792))); + palette_generic_black->insert(new ht_registry_node(256, "text shortcut selected", new palette_entry(0, 34312))); + palette_generic_black->insert(new ht_registry_node(256, "text selected", new palette_entry(0, 0))); + palette_generic_black->insert(new ht_registry_node(256, "text disabled", new palette_entry(0, 1795))); + palette_generic_black->insert(new ht_registry_node(256, "frame focused", new palette_entry(0, 1800))); + palette_generic_black->insert(new ht_registry_node(256, "frame unfocused", new palette_entry(0, 1800))); + palette_generic_black->insert(new ht_registry_node(256, "frame move-resize", new palette_entry(0, 33288))); + palette_generic_black->insert(new ht_registry_node(256, "frame killer", new palette_entry(0, 520))); + palette_generic_black->insert(new ht_registry_node(256, "scrollbar", new palette_entry(0, 7))); + palette_generic_black->insert(new ht_registry_node(256, "input focused", new palette_entry(0, 34561))); + palette_generic_black->insert(new ht_registry_node(256, "input unfocused", new palette_entry(0, 34561))); + palette_generic_black->insert(new ht_registry_node(256, "input selected", new palette_entry(0, 34562))); + palette_generic_black->insert(new ht_registry_node(256, "input clip-chars", new palette_entry(0, 33281))); + palette_generic_black->insert(new ht_registry_node(256, "button focused", new palette_entry(0, 34562))); + palette_generic_black->insert(new ht_registry_node(256, "button unfocused", new palette_entry(0, 2))); + palette_generic_black->insert(new ht_registry_node(256, "button shadow", new palette_entry(0, 8))); + palette_generic_black->insert(new ht_registry_node(256, "button shortcut", new palette_entry(0, 0))); + palette_generic_black->insert(new ht_registry_node(256, "list focused & selected", new palette_entry(0, 34561))); + palette_generic_black->insert(new ht_registry_node(256, "list focused & unselected", new palette_entry(0, 1792))); + palette_generic_black->insert(new ht_registry_node(256, "list unfocused & selected", new palette_entry(0, 34560))); + palette_generic_black->insert(new ht_registry_node(256, "list unfocused & unselected", new palette_entry(0, 0))); + palette_generic_black->insert(new ht_registry_node(256, "cluster focused", new palette_entry(0, 34563))); + palette_generic_black->insert(new ht_registry_node(256, "cluster unfocused", new palette_entry(0, 3))); + palette_generic_black->insert(new ht_registry_node(256, "cluster shortcut", new palette_entry(0, 34307))); // blue - palette_generic_blue->insert(new ht_registry_node(256, "body", create_empty_palette_entry())); - palette_generic_blue->insert(new ht_registry_node(256, "text focused", create_empty_palette_entry())); - palette_generic_blue->insert(new ht_registry_node(256, "text unfocused", create_empty_palette_entry())); - palette_generic_blue->insert(new ht_registry_node(256, "text shortcut", create_empty_palette_entry())); - palette_generic_blue->insert(new ht_registry_node(256, "text shortcut selected", create_empty_palette_entry())); - palette_generic_blue->insert(new ht_registry_node(256, "text selected", create_empty_palette_entry())); - palette_generic_blue->insert(new ht_registry_node(256, "text disabled", create_empty_palette_entry())); - palette_generic_blue->insert(new ht_registry_node(256, "frame focused", create_empty_palette_entry())); - palette_generic_blue->insert(new ht_registry_node(256, "frame unfocused", create_empty_palette_entry())); - palette_generic_blue->insert(new ht_registry_node(256, "frame move-resize", create_empty_palette_entry())); - palette_generic_blue->insert(new ht_registry_node(256, "frame killer", create_empty_palette_entry())); - palette_generic_blue->insert(new ht_registry_node(256, "scrollbar", create_empty_palette_entry())); - palette_generic_blue->insert(new ht_registry_node(256, "input focused", create_empty_palette_entry())); - palette_generic_blue->insert(new ht_registry_node(256, "input unfocused", create_empty_palette_entry())); - palette_generic_blue->insert(new ht_registry_node(256, "input selected", create_empty_palette_entry())); - palette_generic_blue->insert(new ht_registry_node(256, "input clip-chars", create_empty_palette_entry())); - palette_generic_blue->insert(new ht_registry_node(256, "button focused", create_empty_palette_entry())); - palette_generic_blue->insert(new ht_registry_node(256, "button unfocused", create_empty_palette_entry())); - palette_generic_blue->insert(new ht_registry_node(256, "button shadow", create_empty_palette_entry())); - palette_generic_blue->insert(new ht_registry_node(256, "button shortcut", create_empty_palette_entry())); - palette_generic_blue->insert(new ht_registry_node(256, "list focused & selected", create_empty_palette_entry())); - palette_generic_blue->insert(new ht_registry_node(256, "list focused & unselected", create_empty_palette_entry())); - palette_generic_blue->insert(new ht_registry_node(256, "list unfocused & selected", create_empty_palette_entry())); - palette_generic_blue->insert(new ht_registry_node(256, "list unfocused & unselected", create_empty_palette_entry())); - palette_generic_blue->insert(new ht_registry_node(256, "cluster focused", create_empty_palette_entry())); - palette_generic_blue->insert(new ht_registry_node(256, "cluster unfocused", create_empty_palette_entry())); - palette_generic_blue->insert(new ht_registry_node(256, "cluster shortcut", create_empty_palette_entry())); + palette_generic_blue->insert(new ht_registry_node(256, "body", new palette_entry(0, 769))); + palette_generic_blue->insert(new ht_registry_node(256, "text focused", new palette_entry(0, 34305))); + palette_generic_blue->insert(new ht_registry_node(256, "text unfocused", new palette_entry(0, 34561))); + palette_generic_blue->insert(new ht_registry_node(256, "text shortcut", new palette_entry(0, 1))); + palette_generic_blue->insert(new ht_registry_node(256, "text shortcut selected", new palette_entry(0, 1))); + palette_generic_blue->insert(new ht_registry_node(256, "text selected", new palette_entry(0, 257))); + palette_generic_blue->insert(new ht_registry_node(256, "text disabled", new palette_entry(0, 34305))); + palette_generic_blue->insert(new ht_registry_node(256, "frame focused", new palette_entry(0, 34568))); + palette_generic_blue->insert(new ht_registry_node(256, "frame unfocused", new palette_entry(0, 1800))); + palette_generic_blue->insert(new ht_registry_node(256, "frame move-resize", new palette_entry(0, 33288))); + palette_generic_blue->insert(new ht_registry_node(256, "frame killer", new palette_entry(0, 33288))); + palette_generic_blue->insert(new ht_registry_node(256, "scrollbar", new palette_entry(0, 259))); + palette_generic_blue->insert(new ht_registry_node(256, "input focused", new palette_entry(0, 34561))); + palette_generic_blue->insert(new ht_registry_node(256, "input unfocused", new palette_entry(0, 34561))); + palette_generic_blue->insert(new ht_registry_node(256, "input selected", new palette_entry(0, 33031))); + palette_generic_blue->insert(new ht_registry_node(256, "input clip-chars", new palette_entry(0, 33281))); + palette_generic_blue->insert(new ht_registry_node(256, "button focused", new palette_entry(0, 34562))); + palette_generic_blue->insert(new ht_registry_node(256, "button unfocused", new palette_entry(0, 2))); + palette_generic_blue->insert(new ht_registry_node(256, "button shadow", new palette_entry(0, 8))); + palette_generic_blue->insert(new ht_registry_node(256, "button shortcut", new palette_entry(0, 34312))); + palette_generic_blue->insert(new ht_registry_node(256, "list focused & selected", new palette_entry(0, 34563))); + palette_generic_blue->insert(new ht_registry_node(256, "list focused & unselected", new palette_entry(0, 769))); + palette_generic_blue->insert(new ht_registry_node(256, "list unfocused & selected", new palette_entry(0, 3))); + palette_generic_blue->insert(new ht_registry_node(256, "list unfocused & unselected", new palette_entry(0, 769))); + palette_generic_blue->insert(new ht_registry_node(256, "cluster focused", new palette_entry(0, 34563))); + palette_generic_blue->insert(new ht_registry_node(256, "cluster unfocused", new palette_entry(0, 0))); + palette_generic_blue->insert(new ht_registry_node(256, "cluster shortcut", new palette_entry(0, 0))); // cyan - palette_generic_cyan->insert(new ht_registry_node(256, "body", create_empty_palette_entry())); - palette_generic_cyan->insert(new ht_registry_node(256, "text focused", create_empty_palette_entry())); - palette_generic_cyan->insert(new ht_registry_node(256, "text unfocused", create_empty_palette_entry())); - palette_generic_cyan->insert(new ht_registry_node(256, "text shortcut", create_empty_palette_entry())); - palette_generic_cyan->insert(new ht_registry_node(256, "text shortcut selected", create_empty_palette_entry())); - palette_generic_cyan->insert(new ht_registry_node(256, "text selected", create_empty_palette_entry())); - palette_generic_cyan->insert(new ht_registry_node(256, "text disabled", create_empty_palette_entry())); - palette_generic_cyan->insert(new ht_registry_node(256, "frame focused", create_empty_palette_entry())); - palette_generic_cyan->insert(new ht_registry_node(256, "frame unfocused", create_empty_palette_entry())); - palette_generic_cyan->insert(new ht_registry_node(256, "frame move-resize", create_empty_palette_entry())); - palette_generic_cyan->insert(new ht_registry_node(256, "frame killer", create_empty_palette_entry())); - palette_generic_cyan->insert(new ht_registry_node(256, "scrollbar", create_empty_palette_entry())); - palette_generic_cyan->insert(new ht_registry_node(256, "input focused", create_empty_palette_entry())); - palette_generic_cyan->insert(new ht_registry_node(256, "input unfocused", create_empty_palette_entry())); - palette_generic_cyan->insert(new ht_registry_node(256, "input selected", create_empty_palette_entry())); - palette_generic_cyan->insert(new ht_registry_node(256, "input clip-chars", create_empty_palette_entry())); - palette_generic_cyan->insert(new ht_registry_node(256, "button focused", create_empty_palette_entry())); - palette_generic_cyan->insert(new ht_registry_node(256, "button unfocused", create_empty_palette_entry())); - palette_generic_cyan->insert(new ht_registry_node(256, "button shadow", create_empty_palette_entry())); - palette_generic_cyan->insert(new ht_registry_node(256, "button shortcut", create_empty_palette_entry())); - palette_generic_cyan->insert(new ht_registry_node(256, "list focused & selected", create_empty_palette_entry())); - palette_generic_cyan->insert(new ht_registry_node(256, "list focused & unselected", create_empty_palette_entry())); - palette_generic_cyan->insert(new ht_registry_node(256, "list unfocused & selected", create_empty_palette_entry())); - palette_generic_cyan->insert(new ht_registry_node(256, "list unfocused & unselected", create_empty_palette_entry())); - palette_generic_cyan->insert(new ht_registry_node(256, "cluster focused", create_empty_palette_entry())); - palette_generic_cyan->insert(new ht_registry_node(256, "cluster unfocused", create_empty_palette_entry())); - palette_generic_cyan->insert(new ht_registry_node(256, "cluster shortcut", create_empty_palette_entry())); + palette_generic_cyan->insert(new ht_registry_node(256, "body", new palette_entry(0, 3))); + palette_generic_cyan->insert(new ht_registry_node(256, "text focused", new palette_entry(0, 8))); + palette_generic_cyan->insert(new ht_registry_node(256, "text unfocused", new palette_entry(0, 8))); + palette_generic_cyan->insert(new ht_registry_node(256, "text shortcut", new palette_entry(0, 34312))); + palette_generic_cyan->insert(new ht_registry_node(256, "text shortcut selected", new palette_entry(0, 34305))); + palette_generic_cyan->insert(new ht_registry_node(256, "text selected", new palette_entry(0, 8))); + palette_generic_cyan->insert(new ht_registry_node(256, "text disabled", new palette_entry(0, 1792))); + palette_generic_cyan->insert(new ht_registry_node(256, "frame focused", new palette_entry(0, 34568))); + palette_generic_cyan->insert(new ht_registry_node(256, "frame unfocused", new palette_entry(0, 8))); + palette_generic_cyan->insert(new ht_registry_node(256, "frame move-resize", new palette_entry(0, 33288))); + palette_generic_cyan->insert(new ht_registry_node(256, "frame killer", new palette_entry(0, 33288))); + palette_generic_cyan->insert(new ht_registry_node(256, "scrollbar", new palette_entry(0, 769))); + palette_generic_cyan->insert(new ht_registry_node(256, "input focused", new palette_entry(0, 34561))); + palette_generic_cyan->insert(new ht_registry_node(256, "input unfocused", new palette_entry(0, 34561))); + palette_generic_cyan->insert(new ht_registry_node(256, "input selected", new palette_entry(0, 34562))); + palette_generic_cyan->insert(new ht_registry_node(256, "input clip-chars", new palette_entry(0, 33281))); + palette_generic_cyan->insert(new ht_registry_node(256, "button focused", new palette_entry(0, 34562))); + palette_generic_cyan->insert(new ht_registry_node(256, "button unfocused", new palette_entry(0, 2))); + palette_generic_cyan->insert(new ht_registry_node(256, "button shadow", new palette_entry(0, 8))); + palette_generic_cyan->insert(new ht_registry_node(256, "button shortcut", new palette_entry(0, 34312))); + palette_generic_cyan->insert(new ht_registry_node(256, "list focused & selected", new palette_entry(0, 34561))); + palette_generic_cyan->insert(new ht_registry_node(256, "list focused & unselected", new palette_entry(0, 3))); + palette_generic_cyan->insert(new ht_registry_node(256, "list unfocused & selected", new palette_entry(0, 34563))); + palette_generic_cyan->insert(new ht_registry_node(256, "list unfocused & unselected", new palette_entry(0, 3))); + palette_generic_cyan->insert(new ht_registry_node(256, "cluster focused", new palette_entry(0, 34563))); + palette_generic_cyan->insert(new ht_registry_node(256, "cluster unfocused", new palette_entry(0, 3))); + palette_generic_cyan->insert(new ht_registry_node(256, "cluster shortcut", new palette_entry(0, 34307))); // gray - palette_generic_gray->insert(new ht_registry_node(256, "body", create_empty_palette_entry())); - palette_generic_gray->insert(new ht_registry_node(256, "text focused", create_empty_palette_entry())); - palette_generic_gray->insert(new ht_registry_node(256, "text unfocused", create_empty_palette_entry())); - palette_generic_gray->insert(new ht_registry_node(256, "text shortcut", create_empty_palette_entry())); - palette_generic_gray->insert(new ht_registry_node(256, "text shortcut selected", create_empty_palette_entry())); - palette_generic_gray->insert(new ht_registry_node(256, "text selected", create_empty_palette_entry())); - palette_generic_gray->insert(new ht_registry_node(256, "text disabled", create_empty_palette_entry())); - palette_generic_gray->insert(new ht_registry_node(256, "frame focused", create_empty_palette_entry())); - palette_generic_gray->insert(new ht_registry_node(256, "frame unfocused", create_empty_palette_entry())); - palette_generic_gray->insert(new ht_registry_node(256, "frame move-resize", create_empty_palette_entry())); - palette_generic_gray->insert(new ht_registry_node(256, "frame killer", create_empty_palette_entry())); - palette_generic_gray->insert(new ht_registry_node(256, "scrollbar", create_empty_palette_entry())); - palette_generic_gray->insert(new ht_registry_node(256, "input focused", create_empty_palette_entry())); - palette_generic_gray->insert(new ht_registry_node(256, "input unfocused", create_empty_palette_entry())); - palette_generic_gray->insert(new ht_registry_node(256, "input selected", create_empty_palette_entry())); - palette_generic_gray->insert(new ht_registry_node(256, "input clip-chars", create_empty_palette_entry())); - palette_generic_gray->insert(new ht_registry_node(256, "button focused", create_empty_palette_entry())); - palette_generic_gray->insert(new ht_registry_node(256, "button unfocused", create_empty_palette_entry())); - palette_generic_gray->insert(new ht_registry_node(256, "button shadow", create_empty_palette_entry())); - palette_generic_gray->insert(new ht_registry_node(256, "button shortcut", create_empty_palette_entry())); - palette_generic_gray->insert(new ht_registry_node(256, "list focused & selected", create_empty_palette_entry())); - palette_generic_gray->insert(new ht_registry_node(256, "list focused & unselected", create_empty_palette_entry())); - palette_generic_gray->insert(new ht_registry_node(256, "list unfocused & selected", create_empty_palette_entry())); - palette_generic_gray->insert(new ht_registry_node(256, "list unfocused & unselected", create_empty_palette_entry())); - palette_generic_gray->insert(new ht_registry_node(256, "cluster focused", create_empty_palette_entry())); - palette_generic_gray->insert(new ht_registry_node(256, "cluster unfocused", create_empty_palette_entry())); - palette_generic_gray->insert(new ht_registry_node(256, "cluster shortcut", create_empty_palette_entry())); + palette_generic_gray->insert(new ht_registry_node(256, "body", new palette_entry(0, 7))); + palette_generic_gray->insert(new ht_registry_node(256, "text focused", new palette_entry(0, 34568))); + palette_generic_gray->insert(new ht_registry_node(256, "text unfocused", new palette_entry(0, 8))); + palette_generic_gray->insert(new ht_registry_node(256, "text shortcut", new palette_entry(0, 34312))); + palette_generic_gray->insert(new ht_registry_node(256, "text shortcut selected", new palette_entry(0, 34312))); + palette_generic_gray->insert(new ht_registry_node(256, "text selected", new palette_entry(0, 34561))); + palette_generic_gray->insert(new ht_registry_node(256, "text disabled", new palette_entry(0, 32776))); + palette_generic_gray->insert(new ht_registry_node(256, "frame focused", new palette_entry(0, 34568))); + palette_generic_gray->insert(new ht_registry_node(256, "frame unfocused", new palette_entry(0, 8))); + palette_generic_gray->insert(new ht_registry_node(256, "frame move-resize", new palette_entry(0, 33288))); + palette_generic_gray->insert(new ht_registry_node(256, "frame killer", new palette_entry(0, 33288))); + palette_generic_gray->insert(new ht_registry_node(256, "scrollbar", new palette_entry(0, 769))); + palette_generic_gray->insert(new ht_registry_node(256, "input focused", new palette_entry(0, 34561))); + palette_generic_gray->insert(new ht_registry_node(256, "input unfocused", new palette_entry(0, 34561))); + palette_generic_gray->insert(new ht_registry_node(256, "input selected", new palette_entry(0, 34562))); + palette_generic_gray->insert(new ht_registry_node(256, "input clip-chars", new palette_entry(0, 33281))); + palette_generic_gray->insert(new ht_registry_node(256, "button focused", new palette_entry(0, 34562))); + palette_generic_gray->insert(new ht_registry_node(256, "button unfocused", new palette_entry(0, 2))); + palette_generic_gray->insert(new ht_registry_node(256, "button shadow", new palette_entry(0, 8))); + palette_generic_gray->insert(new ht_registry_node(256, "button shortcut", new palette_entry(0, 34312))); + palette_generic_gray->insert(new ht_registry_node(256, "list focused & selected", new palette_entry(0, 34562))); + palette_generic_gray->insert(new ht_registry_node(256, "list focused & unselected", new palette_entry(0, 3))); + palette_generic_gray->insert(new ht_registry_node(256, "list unfocused & selected", new palette_entry(0, 34563))); + palette_generic_gray->insert(new ht_registry_node(256, "list unfocused & unselected", new palette_entry(0, 3))); + palette_generic_gray->insert(new ht_registry_node(256, "cluster focused", new palette_entry(0, 34563))); + palette_generic_gray->insert(new ht_registry_node(256, "cluster unfocused", new palette_entry(0, 3))); + palette_generic_gray->insert(new ht_registry_node(256, "cluster shortcut", new palette_entry(0, 34307))); // gray2 - palette_generic_gray2->insert(new ht_registry_node(256, "body", create_empty_palette_entry())); - palette_generic_gray2->insert(new ht_registry_node(256, "text focused", create_empty_palette_entry())); - palette_generic_gray2->insert(new ht_registry_node(256, "text unfocused", create_empty_palette_entry())); - palette_generic_gray2->insert(new ht_registry_node(256, "text shortcut", create_empty_palette_entry())); - palette_generic_gray2->insert(new ht_registry_node(256, "text shortcut selected", create_empty_palette_entry())); - palette_generic_gray2->insert(new ht_registry_node(256, "text selected", create_empty_palette_entry())); - palette_generic_gray2->insert(new ht_registry_node(256, "text disabled", create_empty_palette_entry())); - palette_generic_gray2->insert(new ht_registry_node(256, "frame focused", create_empty_palette_entry())); - palette_generic_gray2->insert(new ht_registry_node(256, "frame unfocused", create_empty_palette_entry())); - palette_generic_gray2->insert(new ht_registry_node(256, "frame move-resize", create_empty_palette_entry())); - palette_generic_gray2->insert(new ht_registry_node(256, "frame killer", create_empty_palette_entry())); - palette_generic_gray2->insert(new ht_registry_node(256, "scrollbar", create_empty_palette_entry())); - palette_generic_gray2->insert(new ht_registry_node(256, "input focused", create_empty_palette_entry())); - palette_generic_gray2->insert(new ht_registry_node(256, "input unfocused", create_empty_palette_entry())); - palette_generic_gray2->insert(new ht_registry_node(256, "input selected", create_empty_palette_entry())); - palette_generic_gray2->insert(new ht_registry_node(256, "input clip-chars", create_empty_palette_entry())); - palette_generic_gray2->insert(new ht_registry_node(256, "button focused", create_empty_palette_entry())); - palette_generic_gray2->insert(new ht_registry_node(256, "button unfocused", create_empty_palette_entry())); - palette_generic_gray2->insert(new ht_registry_node(256, "button shadow", create_empty_palette_entry())); - palette_generic_gray2->insert(new ht_registry_node(256, "button shortcut", create_empty_palette_entry())); - palette_generic_gray2->insert(new ht_registry_node(256, "list focused & selected", create_empty_palette_entry())); - palette_generic_gray2->insert(new ht_registry_node(256, "list focused & unselected", create_empty_palette_entry())); - palette_generic_gray2->insert(new ht_registry_node(256, "list unfocused & selected", create_empty_palette_entry())); - palette_generic_gray2->insert(new ht_registry_node(256, "list unfocused & unselected", create_empty_palette_entry())); - palette_generic_gray2->insert(new ht_registry_node(256, "cluster focused", create_empty_palette_entry())); - palette_generic_gray2->insert(new ht_registry_node(256, "cluster unfocused", create_empty_palette_entry())); - palette_generic_gray2->insert(new ht_registry_node(256, "cluster shortcut", create_empty_palette_entry())); + palette_generic_gray2->insert(new ht_registry_node(256, "body", new palette_entry(0, 7))); + palette_generic_gray2->insert(new ht_registry_node(256, "text focused", new palette_entry(0, 8))); + palette_generic_gray2->insert(new ht_registry_node(256, "text unfocused", new palette_entry(0, 8))); + palette_generic_gray2->insert(new ht_registry_node(256, "text shortcut", new palette_entry(0, 1032))); + palette_generic_gray2->insert(new ht_registry_node(256, "text shortcut selected", new palette_entry(0, 1032))); + palette_generic_gray2->insert(new ht_registry_node(256, "text selected", new palette_entry(0, 2))); + palette_generic_gray2->insert(new ht_registry_node(256, "text disabled", new palette_entry(0, 1792))); + palette_generic_gray2->insert(new ht_registry_node(256, "frame focused", new palette_entry(0, 8))); + palette_generic_gray2->insert(new ht_registry_node(256, "frame unfocused", new palette_entry(0, 8))); + palette_generic_gray2->insert(new ht_registry_node(256, "frame move-resize", new palette_entry(0, 33288))); + palette_generic_gray2->insert(new ht_registry_node(256, "frame killer", new palette_entry(0, 33288))); + palette_generic_gray2->insert(new ht_registry_node(256, "scrollbar", new palette_entry(0, 8))); + palette_generic_gray2->insert(new ht_registry_node(256, "input focused", new palette_entry(0, 34561))); + palette_generic_gray2->insert(new ht_registry_node(256, "input unfocused", new palette_entry(0, 34561))); + palette_generic_gray2->insert(new ht_registry_node(256, "input selected", new palette_entry(0, 34562))); + palette_generic_gray2->insert(new ht_registry_node(256, "input clip-chars", new palette_entry(0, 33281))); + palette_generic_gray2->insert(new ht_registry_node(256, "button focused", new palette_entry(0, 34562))); + palette_generic_gray2->insert(new ht_registry_node(256, "button unfocused", new palette_entry(0, 2))); + palette_generic_gray2->insert(new ht_registry_node(256, "button shadow", new palette_entry(0, 8))); + palette_generic_gray2->insert(new ht_registry_node(256, "button shortcut", new palette_entry(0, 34312))); + palette_generic_gray2->insert(new ht_registry_node(256, "list focused & selected", new palette_entry(0, 34562))); + palette_generic_gray2->insert(new ht_registry_node(256, "list focused & unselected", new palette_entry(0, 3))); + palette_generic_gray2->insert(new ht_registry_node(256, "list unfocused & selected", new palette_entry(0, 34563))); + palette_generic_gray2->insert(new ht_registry_node(256, "list unfocused & unselected", new palette_entry(0, 3))); + palette_generic_gray2->insert(new ht_registry_node(256, "cluster focused", new palette_entry(0, 34563))); + palette_generic_gray2->insert(new ht_registry_node(256, "cluster unfocused", new palette_entry(0, 3))); + palette_generic_gray2->insert(new ht_registry_node(256, "cluster shortcut", new palette_entry(0, 0))); palette->insert(new ht_registry_node(RNT_SUBDIR, "syntax", new ht_registry_data_stree(palette_syntax))); AVLTree *c = new AVLTree(true); palette_syntax->insert(new ht_registry_node(RNT_SUBDIR, "c", new ht_registry_data_stree(c))); AVLTree *default1 = new AVLTree(true); c->insert(new ht_registry_node(RNT_SUBDIR, "default", new ht_registry_data_stree(default1))); - default1->insert(new ht_registry_node(256, "whitespace", create_empty_palette_entry())); - default1->insert(new ht_registry_node(256, "comment", create_empty_palette_entry())); - default1->insert(new ht_registry_node(256, "identifier", create_empty_palette_entry())); - default1->insert(new ht_registry_node(256, "reserved", create_empty_palette_entry())); - default1->insert(new ht_registry_node(256, "integer number", create_empty_palette_entry())); - default1->insert(new ht_registry_node(256, "float number", create_empty_palette_entry())); - default1->insert(new ht_registry_node(256, "string", create_empty_palette_entry())); - default1->insert(new ht_registry_node(256, "character", create_empty_palette_entry())); - default1->insert(new ht_registry_node(256, "symbol", create_empty_palette_entry())); - default1->insert(new ht_registry_node(256, "preprocess", create_empty_palette_entry())); - default1->insert(new ht_registry_node(256, "meta", create_empty_palette_entry())); + default1->insert(new ht_registry_node(256, "whitespace", new palette_entry(0, 34312))); + default1->insert(new ht_registry_node(256, "comment", new palette_entry(0, 1800))); + default1->insert(new ht_registry_node(256, "identifier", new palette_entry(0, 34312))); + default1->insert(new ht_registry_node(256, "reserved", new palette_entry(0, 34568))); + default1->insert(new ht_registry_node(256, "integer number", new palette_entry(0, 34056))); + default1->insert(new ht_registry_node(256, "float number", new palette_entry(0, 33032))); + default1->insert(new ht_registry_node(256, "string", new palette_entry(0, 33544))); + default1->insert(new ht_registry_node(256, "character", new palette_entry(0, 33544))); + default1->insert(new ht_registry_node(256, "symbol", new palette_entry(0, 34568))); + default1->insert(new ht_registry_node(256, "preprocess", new palette_entry(0, 33288))); + default1->insert(new ht_registry_node(256, "meta", new palette_entry(0, 33032))); palette->insert(new ht_registry_node(RNT_SUBDIR, "tags", new ht_registry_data_stree(palette_tags))); AVLTree *tag_default = new AVLTree(true); palette_tags->insert(new ht_registry_node(RNT_SUBDIR, "default", new ht_registry_data_stree(tag_default))); - tag_default->insert(new ht_registry_node(256, "edit-tag cursor select", create_empty_palette_entry())); - tag_default->insert(new ht_registry_node(256, "edit-tag cursor edit", create_empty_palette_entry())); - tag_default->insert(new ht_registry_node(256, "edit-tag cursor unfocused", create_empty_palette_entry())); - tag_default->insert(new ht_registry_node(256, "edit-tag selected", create_empty_palette_entry())); - tag_default->insert(new ht_registry_node(256, "edit-tag modified", create_empty_palette_entry())); - tag_default->insert(new ht_registry_node(256, "edit-tag", create_empty_palette_entry())); - tag_default->insert(new ht_registry_node(256, "sel-tag cursor focused", create_empty_palette_entry())); - tag_default->insert(new ht_registry_node(256, "sel-tag cursor unfocused", create_empty_palette_entry())); - tag_default->insert(new ht_registry_node(256, "sel-tag", create_empty_palette_entry())); + tag_default->insert(new ht_registry_node(256, "edit-tag cursor select", new palette_entry(0, 34564))); + tag_default->insert(new ht_registry_node(256, "edit-tag cursor edit", new palette_entry(0, 34564))); + tag_default->insert(new ht_registry_node(256, "edit-tag cursor unfocused", new palette_entry(0, 34568))); + tag_default->insert(new ht_registry_node(256, "edit-tag selected", new palette_entry(0, 32775))); + tag_default->insert(new ht_registry_node(256, "edit-tag modified", new palette_entry(0, 33800))); + tag_default->insert(new ht_registry_node(256, "edit-tag", new palette_entry(0, 1800))); + tag_default->insert(new ht_registry_node(256, "sel-tag cursor focused", new palette_entry(0, 34563))); + tag_default->insert(new ht_registry_node(256, "sel-tag cursor unfocused", new palette_entry(0, 3))); + tag_default->insert(new ht_registry_node(256, "sel-tag", new palette_entry(0, 34568))); // build node_types tree node_types = new AVLTree(true); struct bla { - char *identifier; + const char *identifier; ht_registry_node_type type; create_empty_registry_data_func create_empty_registry_data; }; @@ -766,10 +770,9 @@ bool ht_registry::find_any_entry(const char *key, ht_registry_node **node) return false; } -bool ht_registry::find_data_entry(const char *key, ht_registry_node **node, bool follow_symlinks) +bool ht_registry::find_data_entry(const char *key, ht_registry_node **node, bool follow_symlinks, Container **rdir) { - rec_depth = 0; - ht_registry_node *n = find_entry_i(NULL, key, follow_symlinks); + ht_registry_node *n = find_entry_i(rdir, key, follow_symlinks); if (n) { if (n->type == RNT_SUBDIR) return false; *node = n; @@ -782,13 +785,12 @@ ht_registry_node *ht_registry::find_entry_i(Container **rdir, const char *key, b { ht_registry_node *dir = root; const char *s; - char t[256]; /* FIXME: possible buffer overflow */ if (key[0]=='/') key++; while (1) { s = strchr(key, '/'); if (s) { - ht_strlcpy(t, key, s-key+1); - dir = find_entry_get_subdir(((ht_registry_data_stree*)dir->data)->tree, t); + String t((const byte *)key, s - key); + dir = find_entry_get_subdir(((ht_registry_data_stree*)dir->data)->tree, t.contentChar()); if (!dir) break; key = s+1; } else { @@ -1047,41 +1049,48 @@ bool ht_registry::valid_nodename(const char *nodename) return true; } -uint32 get_config_dword(const char *ident) +uint32 get_config_dword(const char *ident, uint32 def) { - char e[HT_NAME_MAX], *ee = e; - strcpy(ee, "/config/"); ee += strlen(ee); - ht_strlcpy(ee, ident, sizeof (e) - (ee-e) + 1); + String e; + e = "/config/"; + e.append(ident); ht_registry_node *n; - if (registry->find_data_entry(e, &n, true)) { + Container *dir; + if (registry->find_data_entry(e.contentChar(), &n, true, &dir)) { if (n->type == RNT_DWORD) { ht_registry_data_dword *s = (ht_registry_data_dword *)n->data; return s->value; } else { const char *q = "?"; registry->get_node_type_desc(n->type, &q); - LOG_EX(LOG_ERROR, "registry key '%s' not of type %s, but: %s", e, "dword", q); + LOG_EX(LOG_ERROR, "registry key '%y' not of type %s, but: %s", &e, "dword", q); } - } else LOG_EX(LOG_ERROR, "registry key '%s' not found", e); - return 0; + } else { + String f(ident); + String dirname, filename; + f.rightSplit('/', dirname, filename); + dir->insert(new ht_registry_node(RNT_DWORD, filename.contentChar(), new ht_registry_data_dword(def))); + LOG_EX(LOG_ERROR, "registry key '%y' not found", &e); + } + return def; } char *get_config_string(const char *ident) { - char e[HT_NAME_MAX], *ee = e; - strcpy(ee, "/config/"); ee += strlen(ee); - ht_strlcpy(ee, ident, sizeof (e) - (ee-e) + 1); + String e; + e = "/config/"; + e.append(ident); ht_registry_node *n; - if (registry->find_data_entry(e, &n, true)) { + if (registry->find_data_entry(e.contentChar(), &n, true)) { if (n->type == RNT_STRING) { ht_registry_data_string *s = (ht_registry_data_string *)n->data; return ht_strdup(s->value); } else { const char *q = "?"; registry->get_node_type_desc(n->type, &q); - LOG_EX(LOG_ERROR, "registry key '%s' not of type %s, but: %s", e, "string", q); + LOG_EX(LOG_ERROR, "registry key '%y' not of type %s, but: %s", &e, "string", q); } - } else LOG_EX(LOG_ERROR, "registry key '%s' not found", e); + } else LOG_EX(LOG_ERROR, "registry key '%y' not found", &e); return NULL; } @@ -1116,13 +1125,22 @@ bool init_registry() /* * load default registry */ +#if ! GENERATE_NEW_REGISTRY ConstMemMapFile f(default_reg, sizeof default_reg); CompressedStream c(&f, false); ObjectStreamBin o(&c, false); GET_OBJECT(o, registry); -// registry = new ht_registry; -// registry->init(); +#else + registry = new ht_registry; + registry->init(); + + LocalFile f("ht.reg", IOAM_WRITE, FOM_CREATE); + CompressedStream c(&f, false); + ObjectStreamBin o(&c, false); + + PUT_OBJECT(o, registry); +#endif return true; } diff --git a/htreg.h b/htreg.h index fcb2618..4cf40d2 100644 --- a/htreg.h +++ b/htreg.h @@ -193,7 +193,7 @@ class ht_registry: public Object { ht_registry_node *enum_prev(const char *dir, ht_registry_node *nextkey); bool find_any_entry(const char *key, ht_registry_node **node); - bool find_data_entry(const char *key, ht_registry_node **node, bool follow_symlinks); + bool find_data_entry(const char *key, ht_registry_node **node, bool follow_symlinks, Container **dir = NULL); /* node type*/ ht_registry_node_type lookup_node_type(const char *identifier); ht_registry_node_type_desc *get_node_type_desc(ht_registry_node_type t, const char **identifier); @@ -215,7 +215,7 @@ class ht_registry: public Object { void debug_dump_i(FILE *f, Container *t, int ident); }; -uint32 get_config_dword(const char *ident); +uint32 get_config_dword(const char *ident, uint32 default_value=0); char *get_config_string(const char *ident); extern ht_registry *registry; From 02786fec5fae6581063a0556fd18d1e701f334b1 Mon Sep 17 00:00:00 2001 From: seppel Date: Thu, 24 Jan 2013 03:14:39 +0000 Subject: [PATCH 47/53] *** empty log message *** --- asm/x86dis.cc | 2 +- asm/x86dis.h | 2 +- blockop.cc | 2 ++ configure.in | 2 +- doc/ht.texi | 4 ++-- htcfg.cc | 4 ++-- htdebug.h | 4 ++-- htformat.cc | 7 ++++--- htinfo.h | 2 +- 9 files changed, 16 insertions(+), 13 deletions(-) diff --git a/asm/x86dis.cc b/asm/x86dis.cc index 37704ce..0830d9c 100644 --- a/asm/x86dis.cc +++ b/asm/x86dis.cc @@ -1436,7 +1436,7 @@ void x86dis::str_op(char *opstr, int *opstrlen, x86dis_insn *insn, x86_insn_op * } -void x86dis::str_format(char **str, const char **format, char *p, char *n, char *op[3], int oplen[3], char stopchar, int print) +void x86dis::str_format(char **str, const char **format, char *p, char *n, char *op[5], int oplen[5], char stopchar, int print) { const char *cs_default = get_cs(e_cs_default); const char *cs_symbol = get_cs(e_cs_symbol); diff --git a/asm/x86dis.h b/asm/x86dis.h index 72da711..af55458 100644 --- a/asm/x86dis.h +++ b/asm/x86dis.h @@ -110,7 +110,7 @@ class x86dis: public Disassembler { bool isfloat(char c); bool isaddr(char c); virtual void prefixes(); - void str_format(char **str, const char **format, char *p, char *n, char *op[3], int oplen[3], char stopchar, int print); + void str_format(char **str, const char **format, char *p, char *n, char *op[5], int oplen[5], char stopchar, int print); virtual void str_op(char *opstr, int *opstrlen, x86dis_insn *insn, x86_insn_op *op, bool explicit_params); uint mkmod(uint modrm); uint mkreg(uint modrm); diff --git a/blockop.cc b/blockop.cc index 239d61f..270f9a5 100644 --- a/blockop.cc +++ b/blockop.cc @@ -371,6 +371,7 @@ Object *create_blockop_str_context(File *file, FileOfs ofs, uint len, uint size, const char *s; int p; get_eval_error(&s, &p); + delete ctx; throw MsgfException("error evaluating '%s': %s at %d", action, s, p); } @@ -493,6 +494,7 @@ Object *create_blockop_int_context(File *file, FileOfs ofs, uint len, uint size, const char *s; int p; get_eval_error(&s, &p); + delete ctx; throw MsgfException("error evaluating '%s': %s at %d", action, s, p); } diff --git a/configure.in b/configure.in index 6494aaa..b89497b 100644 --- a/configure.in +++ b/configure.in @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. -AC_INIT(ht,[2.0.21],[https://sourceforge.net/tracker/?group_id=1066]) +AC_INIT(ht,[2.0.22],[https://sourceforge.net/tracker/?group_id=1066]) AC_PREREQ(2.59) dnl Check the system. diff --git a/doc/ht.texi b/doc/ht.texi index ab7fc10..93614ab 100644 --- a/doc/ht.texi +++ b/doc/ht.texi @@ -51,7 +51,7 @@ be registered in certain jurisdictions. @titlepage @title{HT Manual} -@subtitle{Edition 2.0.21, March 2012} +@subtitle{Edition 2.0.22, March 2012} @author{Stefan Weyergraf, Sebastian Biallas} @c The following two commands start the copyright page. @@ -78,7 +78,7 @@ be registered in certain jurisdictions. @c @macro htversion -2.0.21 +2.0.22 @end macro @macro hturl diff --git a/htcfg.cc b/htcfg.cc index 130ba35..2424a71 100644 --- a/htcfg.cc +++ b/htcfg.cc @@ -112,7 +112,7 @@ loadstore_result save_systemconfig(String &error_info) break; } /* write config */ - app->store(*d.get()); + app->store(*d); } catch (const Exception &e) { e.reason(error_info); return LS_ERROR_WRITE; @@ -157,7 +157,7 @@ bool load_systemconfig(loadstore_result *result, int *error_info) } /* read config */ - app->load(*d.get()); + app->load(*d); } catch (const ObjectNotRegisteredException &) { *result = LS_ERROR_CORRUPTED; if (object_stream_type==object_stream_txt && d.get()) { diff --git a/htdebug.h b/htdebug.h index c6015fe..57e48df 100644 --- a/htdebug.h +++ b/htdebug.h @@ -29,8 +29,8 @@ #define HTDEBUG /****************************************************************************/ -void ht_assert_failed(const char *file, int line, const char *assertion); -void ht_error(const char *file, int line, const char *format,...); +void ht_assert_failed(const char *file, int line, const char *assertion) __attribute__ ((noreturn)); +void ht_error(const char *file, int line, const char *format,...) __attribute__ ((noreturn)); void ht_trace(const char *file, int line, const char *format,...); void ht_warn(const char *file, int line, const char *format,...); diff --git a/htformat.cc b/htformat.cc index 97f4e6c..2cb9615 100644 --- a/htformat.cc +++ b/htformat.cc @@ -3469,6 +3469,9 @@ bool ht_uformat_viewer::ref_desc(ID id, FileOfs offset, uint size, bool bigendia Endianess end = bigendian ? big_endian : little_endian; int_hash *desc=(int_hash*)getAtomValue(id); if (desc) { + byte buf[4]; + if (pread(offset, buf, size) != size) return false; + Bounds b; b.w = 60; b.h = 14; @@ -3484,12 +3487,10 @@ bool ht_uformat_viewer::ref_desc(ID id, FileOfs offset, uint size, bool bigendia ht_itext_listbox *l = new ht_itext_listbox(); l->init(&b, 2, 1); - byte buf[4]; int curpos = 0; int i = 0; int d = 0; - if (pread(offset, buf, size) != size) return false; switch (size) { case 1: d = buf[0]; break; @@ -3549,7 +3550,7 @@ bool ht_uformat_viewer::ref_desc(ID id, FileOfs offset, uint size, bool bigendia createForeignInt(buf, v, size, end); pwrite(offset, buf, size); dirtyview(); - } + } } } diff --git a/htinfo.h b/htinfo.h index b3cff3e..2b83860 100644 --- a/htinfo.h +++ b/htinfo.h @@ -24,7 +24,7 @@ #define ht_url "http://hte.sourceforge.net" #define ht_name "ht" -#define ht_version "2.0.21" +#define ht_version "2.0.22" #define ht_author1 "Stefan Weyergraf" #define ht_copyright1 "(c) 1999-2004 "ht_author1 From a66fcf80f1f486c63f236d83ab5f666e3b38d075 Mon Sep 17 00:00:00 2001 From: seppel Date: Thu, 31 Jan 2013 01:27:47 +0000 Subject: [PATCH 48/53] *** empty log message *** --- asm/x86asm.cc | 4 ++-- doc/ht.texi | 6 +++--- htinfo.h | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/asm/x86asm.cc b/asm/x86asm.cc index a36f630..e82f513 100644 --- a/asm/x86asm.cc +++ b/asm/x86asm.cc @@ -2110,7 +2110,7 @@ bool x86asm::translate_str(asm_insn *asm_insn, const char *s) } /**/ - splitstr(s, insn->n, sizeof insn->n, (char**)&opp, 256); + splitstr(s, insn->n, sizeof insn->n, (char**)opp, 256); insn->name = insn->n; for (int i=0; i<5; i++) { if (!*op[i]) break; @@ -2151,7 +2151,7 @@ int x86asm::simmsize(uint64 imm, int immsize) return 8; } -void x86asm::splitstr(const char *s, char *name, int size, char *op[5], int opsize) +void x86asm::splitstr(const char *s, char *name, int size, char **op, int opsize) { const char *a, *b; bool wantbreak = false; diff --git a/doc/ht.texi b/doc/ht.texi index 93614ab..7e94503 100644 --- a/doc/ht.texi +++ b/doc/ht.texi @@ -23,7 +23,7 @@ END-INFO-DIR-ENTRY This file documents the HT Editor. @c -Copyright @copyright{} 1999-2012 The HT authors. @* +Copyright @copyright{} 1999-2013 The HT authors. @* @xref{Authors, The HT Authors, The HT Authors}, for a list of the copyright holders. @@ -51,14 +51,14 @@ be registered in certain jurisdictions. @titlepage @title{HT Manual} -@subtitle{Edition 2.0.22, March 2012} +@subtitle{Edition 2.0.22, January 2013} @author{Stefan Weyergraf, Sebastian Biallas} @c The following two commands start the copyright page. @page @vskip 0pt plus 1filll -Copyright @copyright{} 1999-2012 The HT authors. @* +Copyright @copyright{} 1999-2013 The HT authors. @* @xref{Authors, The HT Authors, The HT Authors}, for a list of the copyright holders. diff --git a/htinfo.h b/htinfo.h index 2b83860..e288d30 100644 --- a/htinfo.h +++ b/htinfo.h @@ -31,6 +31,6 @@ #define ht_author2 "Sebastian Biallas" #define ht_mail2 "sb@biallas.net" -#define ht_copyright2 "(c) 1999-2012 "ht_author2" <"ht_mail2">" +#define ht_copyright2 "(c) 1999-2013 "ht_author2" <"ht_mail2">" #endif /* !__HTINFO_H__ */ From dd7e407d4e7da76835f9fbf52acb1c0f5db15bcc Mon Sep 17 00:00:00 2001 From: seppel Date: Thu, 28 Feb 2013 23:21:18 +0000 Subject: [PATCH 49/53] *** empty log message *** --- COPYING | 32 ++++++++++++++++---------------- ChangeLog | 1 + Makefile.am | 2 -- configure.in | 4 ++-- doc/ht.texi | 8 ++++---- 5 files changed, 23 insertions(+), 24 deletions(-) diff --git a/COPYING b/COPYING index 103ca6d..d159169 100644 --- a/COPYING +++ b/COPYING @@ -1,12 +1,12 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111 USA + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - Preamble + Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public @@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to +the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not @@ -56,7 +56,7 @@ patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. - GNU GENERAL PUBLIC LICENSE + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains @@ -255,7 +255,7 @@ make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. - NO WARRANTY + NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN @@ -277,9 +277,9 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - END OF TERMS AND CONDITIONS + END OF TERMS AND CONDITIONS - Appendix: How to Apply These Terms to Your New Programs + How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it @@ -291,7 +291,7 @@ convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - Copyright (C) 19yy + Copyright (C) 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 @@ -303,16 +303,16 @@ the "copyright" line and a pointer to where the full notice is found. 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 USA + 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., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: - Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. @@ -335,5 +335,5 @@ necessary. Here is a sample; alter the names: This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General +library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. diff --git a/ChangeLog b/ChangeLog index 2e95e1e..10448be 100644 --- a/ChangeLog +++ b/ChangeLog @@ -8,6 +8,7 @@ version 2.0.22: - Added new option "editor/scroll offset" which determines how many extra lines the cursor should be visible when scolling (Thanks tecknicaltom) + - Updated address of FSF version 2.0.21: - [x86] AVX2 updates diff --git a/Makefile.am b/Makefile.am index fef3ad7..ca5389b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,5 +1,3 @@ -AUTOMAKE_OPTIONS = foreign - AM_CPPFLAGS = ${my_CPPFLAGS} -I$(srcdir)/$(ANALYSER_DIR) \ -I$(srcdir)/$(ASM_DIR) -I$(srcdir)/$(INFO_DIR) \ -I$(srcdir)/$(IO_DIR) -I$(srcdir)/$(COMIO_DIR) \ diff --git a/configure.in b/configure.in index b89497b..20c4a55 100644 --- a/configure.in +++ b/configure.in @@ -34,8 +34,8 @@ fi CFLAGS="$default_user_CFLAGS" CXXFLAGS="$default_user_CFLAGS" -AM_INIT_AUTOMAKE -AM_CONFIG_HEADER(config.h) +AM_INIT_AUTOMAKE([foreign]) +AC_CONFIG_HEADERS([config.h]) dnl Check OS specifica diff --git a/doc/ht.texi b/doc/ht.texi index 7e94503..d7d8d3c 100644 --- a/doc/ht.texi +++ b/doc/ht.texi @@ -126,10 +126,10 @@ 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 USA + +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., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. @end quotation @node Key bindings, , Top, Top From cb64ac7bd17eb7e9d7553bc10494a4e337ac1308 Mon Sep 17 00:00:00 2001 From: seppel Date: Fri, 5 Apr 2013 22:49:09 +0000 Subject: [PATCH 50/53] *** empty log message *** --- doc/ht.texi | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/ht.texi b/doc/ht.texi index d7d8d3c..616602a 100644 --- a/doc/ht.texi +++ b/doc/ht.texi @@ -50,10 +50,10 @@ be registered in certain jurisdictions. @titlepage -@title{HT Manual} -@subtitle{Edition 2.0.22, January 2013} +@title HT Manual +@subtitle Edition 2.0.22, January 2013 -@author{Stefan Weyergraf, Sebastian Biallas} +@author Stefan Weyergraf, Sebastian Biallas @c The following two commands start the copyright page. @page @vskip 0pt plus 1filll @@ -135,7 +135,7 @@ with this program; if not, write to the Free Software Foundation, Inc., @node Key bindings, , Top, Top @unnumberedsec Key bindings -@macro key_table_columns +@macro keytablecolumns .25 .75 @end macro From feeb245447bbac6c01ecf146f4426055d5617e49 Mon Sep 17 00:00:00 2001 From: seppel Date: Thu, 13 Jun 2013 19:31:15 +0000 Subject: [PATCH 51/53] *** empty log message *** --- configure.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.in b/configure.in index 20c4a55..0cb2f1b 100644 --- a/configure.in +++ b/configure.in @@ -22,7 +22,7 @@ my_CXXFLAGS="-Wall -Woverloaded-virtual -Wnon-virtual-dtor -fsigned-char" if test "x$enable_maintainermode" = "xno"; then if test "x$enable_release" = "xyes"; then - default_user_CFLAGS="-O3 -fomit-frame-pointer" + default_user_CFLAGS="-O3 -Wall -fomit-frame-pointer" else default_user_CFLAGS="-ggdb3 -O0 -Wall" fi From 0ad14ec28941300bd73b6ea0b417ec94e7bc86bc Mon Sep 17 00:00:00 2001 From: seppel Date: Thu, 13 Jun 2013 20:54:23 +0000 Subject: [PATCH 52/53] *** empty log message *** --- ChangeLog | 2 ++ analyser/analy_alpha.cc | 6 +++--- analyser/analy_alpha.h | 2 +- analyser/elf_analy.cc | 35 ++++++++++++++++++++++------------- analyser/elf_analy.h | 2 +- asm/alphadis.cc | 13 +++++++------ asm/alphadis.h | 1 + doc/ht.texi | 3 +++ elfstruc.h | 10 ++++++++++ htelfhd.cc | 2 ++ 10 files changed, 52 insertions(+), 24 deletions(-) diff --git a/ChangeLog b/ChangeLog index 10448be..fe67a0f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -8,6 +8,8 @@ version 2.0.22: - Added new option "editor/scroll offset" which determines how many extra lines the cursor should be visible when scolling (Thanks tecknicaltom) + - Fixed loading of ELF files for alpha + - Fixed some compilation problems with newer toolchain - Updated address of FSF version 2.0.21: diff --git a/analyser/analy_alpha.cc b/analyser/analy_alpha.cc index f97dc67..adf6cdc 100644 --- a/analyser/analy_alpha.cc +++ b/analyser/analy_alpha.cc @@ -65,7 +65,7 @@ ObjectID AnalyAlphaDisassembler::getObjectID() const */ Address *AnalyAlphaDisassembler::branchAddr(OPCODE *opcode, branch_enum_t branchtype, bool examine) { - Address *a = createAddress(((alphadis_insn *)opcode)->data); + Address *a = createAddress(((alphadis_insn *)opcode)->address); if (examine && analy->validAddress(a, scvalid)) { return a; } @@ -73,9 +73,9 @@ Address *AnalyAlphaDisassembler::branchAddr(OPCODE *opcode, branch_enum_t branch return new InvalidAddress(); } -Address *AnalyAlphaDisassembler::createAddress(uint32 offset) +Address *AnalyAlphaDisassembler::createAddress(uint64 offset) { - return new AddressFlat32(offset); + return new AddressFlat64(offset); } /* diff --git a/analyser/analy_alpha.h b/analyser/analy_alpha.h index f69bc6d..e9d0f8f 100644 --- a/analyser/analy_alpha.h +++ b/analyser/analy_alpha.h @@ -34,7 +34,7 @@ class AnalyAlphaDisassembler: public AnalyDisassembler { virtual ObjectID getObjectID() const; virtual Address *branchAddr(OPCODE *opcode, branch_enum_t branchtype, bool examine); - Address *createAddress(uint32 offset); + Address *createAddress(uint64 offset); virtual void examineOpcode(OPCODE *opcode); virtual branch_enum_t isBranch(OPCODE *opcode); virtual void store(ObjectStream &f) const; diff --git a/analyser/elf_analy.cc b/analyser/elf_analy.cc index 2c61b24..ffe53d8 100644 --- a/analyser/elf_analy.cc +++ b/analyser/elf_analy.cc @@ -621,7 +621,7 @@ void ElfAnalyser::initUnasm() break; case ELF_EM_X86_64: if (elf_shared->ident.e_ident[ELF_EI_CLASS] != ELFCLASS64) { - errorbox("x86_64 cant be used in a 32-Bit ELF."); + errorbox("x86_64 can't be used in a 32-Bit ELF."); } else { analy_disasm = new AnalyX86Disassembler(); ((AnalyX86Disassembler*)analy_disasm)->init(this, ANALYX86DISASSEMBLER_FLAGS_AMD64 | ANALYX86DISASSEMBLER_FLAGS_FLAT64); @@ -629,7 +629,7 @@ void ElfAnalyser::initUnasm() break; case ELF_EM_IA_64: // Intel ia64 if (elf_shared->ident.e_ident[ELF_EI_CLASS] != ELFCLASS64) { - errorbox("Intel IA64 cant be used in a 32-Bit ELF."); + errorbox("Intel IA64 can't be used in a 32-Bit ELF."); } else { analy_disasm = new AnalyIA64Disassembler(); ((AnalyIA64Disassembler*)analy_disasm)->init(this); @@ -637,7 +637,7 @@ void ElfAnalyser::initUnasm() break; case ELF_EM_PPC: // PowerPC if (elf_shared->ident.e_ident[ELF_EI_CLASS] != ELFCLASS32) { - errorbox("PowerPC32 cant be used in a 64-Bit ELF."); + errorbox("PowerPC32 can't be used in a 64-Bit ELF."); } else { DPRINTF("initing analy_ppc_disassembler\n"); analy_disasm = new AnalyPPCDisassembler(); @@ -646,22 +646,31 @@ void ElfAnalyser::initUnasm() break; case ELF_EM_PPC64: // PowerPC64 if (elf_shared->ident.e_ident[ELF_EI_CLASS] != ELFCLASS64) { - errorbox("PowerPC64 cant be used in a 32-Bit ELF."); + errorbox("PowerPC64 can't be used in a 32-Bit ELF."); } else { DPRINTF("initing analy_ppc_disassembler\n"); analy_disasm = new AnalyPPCDisassembler(); ((AnalyPPCDisassembler*)analy_disasm)->init(this, ANALY_PPC_64); } break; - case ELF_EM_ARM: // Arm - if (elf_shared->ident.e_ident[ELF_EI_CLASS] != ELFCLASS32) { - errorbox("ARM cant be used in a 64-Bit ELF."); - } else { - DPRINTF("initing analy_arm_disassembler\n"); - analy_disasm = new AnalyArmDisassembler(); - ((AnalyArmDisassembler*)analy_disasm)->init(this); - } - break; + case ELF_EM_ARM: // Arm + if (elf_shared->ident.e_ident[ELF_EI_CLASS] != ELFCLASS32) { + errorbox("ARM can't be used in a 64-Bit ELF."); + } else { + DPRINTF("initing analy_arm_disassembler\n"); + analy_disasm = new AnalyArmDisassembler(); + ((AnalyArmDisassembler*)analy_disasm)->init(this); + } + break; + case ELF_EM_ALPHA: + if (elf_shared->ident.e_ident[ELF_EI_CLASS] != ELFCLASS64) { + errorbox("Alpha can't be used in a 32-Bit ELF."); + } else { + DPRINTF("initing analy_alpha_disassembler\n"); + analy_disasm = new AnalyAlphaDisassembler(); + ((AnalyAlphaDisassembler*)analy_disasm)->init(this); + } + break; default: DPRINTF("no apropriate disassembler for machine %04x\n", machine); warnbox("No disassembler for unknown machine type %04x!", machine); diff --git a/analyser/elf_analy.h b/analyser/elf_analy.h index b8bf1b4..85008ab 100644 --- a/analyser/elf_analy.h +++ b/analyser/elf_analy.h @@ -33,7 +33,7 @@ class ElfAnalyser: public Analyser { File *file; Area *validarea; - ElfAnalyser() {}; + ElfAnalyser() {}; ElfAnalyser(BuildCtorArg&a): Analyser(a) {}; void init(ht_elf_shared_data *elf_shared, File *File); void load(ObjectStream &f); diff --git a/asm/alphadis.cc b/asm/alphadis.cc index bfbf887..5991737 100644 --- a/asm/alphadis.cc +++ b/asm/alphadis.cc @@ -203,7 +203,7 @@ dis_insn *Alphadis::decode(byte *code, int maxlen, CPU_ADDR addr) if (BITS_BSIGN(insn.data)) insn.data |= -1 ^ 0x1fffff; insn.data += 1; insn.data *= 4; - insn.data += addr.addr32.offset; + insn.address = sint64(insn.data) + addr.flat64.addr; break; case ALPHA_GROUP_FBR: insn.regA = BITS_REGA(opcode) + REG_FLOAT; @@ -213,13 +213,14 @@ dis_insn *Alphadis::decode(byte *code, int maxlen, CPU_ADDR addr) if (BITS_BSIGN(insn.data)) insn.data |= -1 ^ 0x1fffff; insn.data += 1; insn.data *= 4; - insn.data += addr.addr32.offset; + insn.address = sint64(insn.data) + addr.flat64.addr; break; case ALPHA_GROUP_JMP: insn.regA = BITS_REGA(opcode); insn.regB = BITS_REGB(opcode); insn.regC = REG_ZERO; insn.data = BITS_HINT(opcode); + insn.address = sint64(insn.data); break; case ALPHA_GROUP_PAL: insn.regA = REG_ZERO; @@ -336,7 +337,7 @@ const char *Alphadis::strf(dis_insn *disasm_insn, int style, const char *format) case ALPHA_GROUP_BRA: case ALPHA_GROUP_FBR: { CPU_ADDR caddr; - caddr.addr32.offset = (uint32)alpha_insn->data; + caddr.flat64.addr = alpha_insn->address; int slen; char *p; char *s = (addr_sym_func) ? addr_sym_func(caddr, &slen, addr_sym_func_context) : 0; @@ -345,13 +346,13 @@ const char *Alphadis::strf(dis_insn *disasm_insn, int style, const char *format) memmove(p, s, slen); p[slen] = 0; } else { - sprintf(insnstr, "%-10s %s%s, %s0x%x", A_NAME, A_REG_A, cs_symbol, cs_number, (uint32)alpha_insn->data); + sprintf(insnstr, "%-10s %s%s, %s0x%qx", A_NAME, A_REG_A, cs_symbol, cs_number, &alpha_insn->address); } break; } case ALPHA_GROUP_JMP: { CPU_ADDR caddr; - caddr.addr32.offset = (uint32)alpha_insn->data; + caddr.flat64.addr = alpha_insn->address; int slen; char *s = (addr_sym_func) ? addr_sym_func(caddr, &slen, addr_sym_func_context) : 0; if (s) { @@ -370,7 +371,7 @@ const char *Alphadis::strf(dis_insn *disasm_insn, int style, const char *format) goto is_invalid; } disable_highlighting(); - return insnstr; + return insnstr; } bool Alphadis::validInsn(dis_insn *disasm_insn) diff --git a/asm/alphadis.h b/asm/alphadis.h index d957ba7..9d9f9d8 100644 --- a/asm/alphadis.h +++ b/asm/alphadis.h @@ -28,6 +28,7 @@ struct alphadis_insn { bool valid; int size; /* only useful if invalid (else 4) */ sint32 data; /* must be signed */ + uint64 address; uint16 code; byte regA; byte regB; diff --git a/doc/ht.texi b/doc/ht.texi index 616602a..719c940 100644 --- a/doc/ht.texi +++ b/doc/ht.texi @@ -454,6 +454,9 @@ C functions (actually they ARE more or less wrappers for them); see @file{eval/e details (sorry but a detailed help would get outdated rather soon). The symbol _ always refers to the last result. +If you are in a hex buffer, the variable @code{first} contains the offset of the first byte and the variable +@code{last} contains the offset of the last byte. This is useful, for instace, if you want to jump to the last byte of a file. + If you are in a hex buffer, the variable @code{first} contains the offset of the first byte and the variable @code{last} contains the offset of the last byte. This is useful, for instance, if you want to jump to the last byte of a file. diff --git a/elfstruc.h b/elfstruc.h index 995b300..eec1f2c 100644 --- a/elfstruc.h +++ b/elfstruc.h @@ -240,6 +240,16 @@ typedef uint16 elf64_quarter; #define ELF_EM_METAG 174 /* Imagination Technologies META processor architecture */ #define ELF_EM_MCST_ELBRUS 175 /* MCST Elbrus general purpose hardware architecture */ #define ELF_EM_ECOG16 176 /* Cyan Technology eCOG16 family */ +#define ELF_EM_CR16 177 /* National Semiconductor CompactRISC 16-bit processor */ +#define ELF_EM_ETPU 178 /* Freescale Extended Time Processing Unit */ +#define ELF_EM_SLE9X 179 /* Infineon Technologies SLE9X core */ +#define ELF_EM_L1OM 180 /* Intel L1OM */ +#define ELF_EM_K1OM 181 /* Intel K1OM */ +#define ELF_EM_INTEL182 182 /* Reserved by Intel */ +#define ELF_EM_AARCH64 183 /* ARM 64-bit architecture */ +#define ELF_EM_ARM184 184 /* Reserved by ARM */ +#define EFL_EM_AVR32 185 /* Atmel Corporation 32-bit microprocessor family */ +#define ELF_EM_ALPHA 0x9026 /* e_version */ diff --git a/htelfhd.cc b/htelfhd.cc index a61e7a3..b338f65 100644 --- a/htelfhd.cc +++ b/htelfhd.cc @@ -189,6 +189,8 @@ static int_hash elf_machine[] = {ELF_EM_PJ, "picoJava"}, {ELF_EM_C166, "Infineon C16x/XC16x processor"}, + + {ELF_EM_ALPHA, "Alpha"}, {0, 0} }; From 19d2838b186c278d39a4b78fdfdb6226f89c2bf0 Mon Sep 17 00:00:00 2001 From: seppel Date: Thu, 13 Jun 2013 20:56:05 +0000 Subject: [PATCH 53/53] *** empty log message *** --- ChangeLog | 1 - 1 file changed, 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index fe67a0f..4e0ea03 100644 --- a/ChangeLog +++ b/ChangeLog @@ -9,7 +9,6 @@ version 2.0.22: extra lines the cursor should be visible when scolling (Thanks tecknicaltom) - Fixed loading of ELF files for alpha - - Fixed some compilation problems with newer toolchain - Updated address of FSF version 2.0.21: