From: Jeremy Drake <cyg...@jdrake.com> This ifdefs out the large table of opcode strings (and the function that references it) since we're only interested in walking machine code, not generating disassembly, and makes a couple of other tables "const" so that they end up in .rdata instead of .data.
Signed-off-by: Jeremy Drake <cyg...@jdrake.com> --- winsup/cygwin/Makefile.am | 12 ++++++++++-- winsup/cygwin/udis86/decode.c | 13 +++++++------ winsup/cygwin/udis86/decode.h | 4 ++-- winsup/cygwin/udis86/extern.h | 4 ++++ winsup/cygwin/udis86/itab.c | 7 +++++-- winsup/cygwin/udis86/itab.h | 2 ++ winsup/cygwin/udis86/types.h | 14 ++++++++++++-- winsup/cygwin/udis86/udint.h | 8 +++++--- winsup/cygwin/udis86/udis86.c | 9 ++++++++- 9 files changed, 55 insertions(+), 18 deletions(-) diff --git a/winsup/cygwin/Makefile.am b/winsup/cygwin/Makefile.am index a0e839701a..fdd026a525 100644 --- a/winsup/cygwin/Makefile.am +++ b/winsup/cygwin/Makefile.am @@ -48,7 +48,6 @@ LIB_NAME=libcygwin.a # sources # -# These objects are included directly into the import library if TARGET_X86_64 TARGET_FILES= \ x86_64/bcopy.S \ @@ -64,6 +63,7 @@ TARGET_FILES= \ x86_64/wmempcpy.S endif +# These objects are included directly into the import library LIB_FILES= \ lib/_cygwin_crt0_common.cc \ lib/atexit.c \ @@ -267,6 +267,13 @@ SEC_FILES= \ TZCODE_FILES= \ tzcode/localtime_wrapper.c +if TARGET_X86_64 +UDIS86_FILES= \ + udis86/decode.c \ + udis86/itab.c \ + udis86/udis86.c +endif + DLL_FILES= \ advapi32.cc \ aio.cc \ @@ -389,6 +396,7 @@ libdll_a_SOURCES= \ $(MM_FILES) \ $(SEC_FILES) \ $(TZCODE_FILES) \ + $(UDIS86_FILES) \ $(GENERATED_FILES) # @@ -423,7 +431,7 @@ BUILT_SOURCES = \ # Every time we touch a source file, the version info has to be rebuilt # to maintain a correct build date, especially in uname release output -dirs = $(srcdir) $(srcdir)/fhandler $(srcdir)/lib $(srcdir)/libc $(srcdir)/math $(srcdir)/mm $(srcdir)/regex $(srcdir)/sec $(srcdir)/tzcode +dirs = $(srcdir) $(srcdir)/fhandler $(srcdir)/lib $(srcdir)/libc $(srcdir)/math $(srcdir)/mm $(srcdir)/regex $(srcdir)/sec $(srcdir)/tzcode $(srcdir)/udis86 find_src_files = $(wildcard $(dir)/*.[chS]) $(wildcard $(dir)/*.cc) src_files := $(foreach dir,$(dirs),$(find_src_files)) diff --git a/winsup/cygwin/udis86/decode.c b/winsup/cygwin/udis86/decode.c index b4efa778ca..1fe50e19f6 100644 --- a/winsup/cygwin/udis86/decode.c +++ b/winsup/cygwin/udis86/decode.c @@ -23,8 +23,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "udint.h" +#include "winsup.h" #include "types.h" +#include "udint.h" #include "decode.h" #ifndef __UD_STANDALONE__ @@ -204,7 +205,7 @@ static int decode_prefixes(struct ud *u) { int done = 0; - uint8_t curr, last = 0; + uint8_t curr = 0, last = 0; UD_RETURN_ON_ERROR(u); do { @@ -653,12 +654,12 @@ decode_operand(struct ud *u, break; case OP_F: u->br_far = 1; - /* intended fall through */ + fallthrough; case OP_M: if (MODRM_MOD(modrm(u)) == 3) { UDERR(u, "expected modrm.mod != 3\n"); } - /* intended fall through */ + fallthrough; case OP_E: decode_modrm_rm(u, operand, REGCLASS_GPR, size); break; @@ -677,7 +678,7 @@ decode_operand(struct ud *u, if (MODRM_MOD(modrm(u)) != 3) { UDERR(u, "expected modrm.mod == 3\n"); } - /* intended fall through */ + fallthrough; case OP_Q: decode_modrm_rm(u, operand, REGCLASS_MMX, size); break; @@ -688,7 +689,7 @@ decode_operand(struct ud *u, if (MODRM_MOD(modrm(u)) != 3) { UDERR(u, "expected modrm.mod == 3\n"); } - /* intended fall through */ + fallthrough; case OP_W: decode_modrm_rm(u, operand, REGCLASS_XMM, size); break; diff --git a/winsup/cygwin/udis86/decode.h b/winsup/cygwin/udis86/decode.h index a7362c84a4..8d1af5705c 100644 --- a/winsup/cygwin/udis86/decode.h +++ b/winsup/cygwin/udis86/decode.h @@ -183,8 +183,8 @@ ud_opcode_field_sext(uint8_t primary_opcode) return (primary_opcode & 0x02) != 0; } -extern struct ud_itab_entry ud_itab[]; -extern struct ud_lookup_table_list_entry ud_lookup_table_list[]; +extern const struct ud_itab_entry ud_itab[]; +extern const struct ud_lookup_table_list_entry ud_lookup_table_list[]; #endif /* UD_DECODE_H */ diff --git a/winsup/cygwin/udis86/extern.h b/winsup/cygwin/udis86/extern.h index ae9f82f225..0a5e892237 100644 --- a/winsup/cygwin/udis86/extern.h +++ b/winsup/cygwin/udis86/extern.h @@ -60,9 +60,11 @@ extern unsigned int ud_decode(struct ud*); extern unsigned int ud_disassemble(struct ud*); +#ifndef __INSIDE_CYGWIN__ extern void ud_translate_intel(struct ud*); extern void ud_translate_att(struct ud*); +#endif /* __INSIDE_CYGWIN__ */ extern const char* ud_insn_asm(const struct ud* u); @@ -82,7 +84,9 @@ extern int ud_opr_is_gpr(const struct ud_operand *opr); extern enum ud_mnemonic_code ud_insn_mnemonic(const struct ud *u); +#ifndef __INSIDE_CYGWIN__ extern const char* ud_lookup_mnemonic(enum ud_mnemonic_code c); +#endif /* __INSIDE_CYGWIN__ */ extern void ud_set_user_opaque_data(struct ud*, void*); diff --git a/winsup/cygwin/udis86/itab.c b/winsup/cygwin/udis86/itab.c index a3d0634b86..11c350b78e 100644 --- a/winsup/cygwin/udis86/itab.c +++ b/winsup/cygwin/udis86/itab.c @@ -1,4 +1,5 @@ /* itab.c -- generated by udis86:scripts/ud_itab.py, do no edit */ +#include "winsup.h" #include "decode.h" #define GROUP(n) (0x8000 | (n)) @@ -5028,7 +5029,7 @@ const uint16_t ud_itab__0[] = { }; -struct ud_lookup_table_list_entry ud_lookup_table_list[] = { +const struct ud_lookup_table_list_entry ud_lookup_table_list[] = { /* 000 */ { ud_itab__0, UD_TAB__OPC_TABLE, "table0" }, /* 001 */ { ud_itab__1, UD_TAB__OPC_MODE, "/m" }, /* 002 */ { ud_itab__2, UD_TAB__OPC_MODE, "/m" }, @@ -6294,7 +6295,7 @@ struct ud_lookup_table_list_entry ud_lookup_table_list[] = { #define O_sIv { OP_sI, SZ_V } #define O_sIz { OP_sI, SZ_Z } -struct ud_itab_entry ud_itab[] = { +const struct ud_itab_entry ud_itab[] = { /* 0000 */ { UD_Iinvalid, O_NONE, O_NONE, O_NONE, P_none }, /* 0001 */ { UD_Iadd, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0002 */ { UD_Iadd, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, @@ -7749,6 +7750,7 @@ struct ud_itab_entry ud_itab[] = { }; +#ifndef __INSIDE_CYGWIN__ const char * ud_mnemonics_str[] = { "invalid", "3dnow", @@ -8399,3 +8401,4 @@ const char * ud_mnemonics_str[] = { "movbe", "crc32" }; +#endif /* __INSIDE_CYGWIN__ */ diff --git a/winsup/cygwin/udis86/itab.h b/winsup/cygwin/udis86/itab.h index 778a76d610..b6924b747a 100644 --- a/winsup/cygwin/udis86/itab.h +++ b/winsup/cygwin/udis86/itab.h @@ -673,6 +673,8 @@ enum ud_mnemonic_code { UD_MAX_MNEMONIC_CODE } UD_ATTR_PACKED; +#ifndef __INSIDE_CYGWIN__ extern const char * ud_mnemonics_str[]; +#endif /* __INSIDE_CYGWIN__ */ #endif /* UD_ITAB_H */ diff --git a/winsup/cygwin/udis86/types.h b/winsup/cygwin/udis86/types.h index 8b012a98e6..2d2dc683c1 100644 --- a/winsup/cygwin/udis86/types.h +++ b/winsup/cygwin/udis86/types.h @@ -36,6 +36,14 @@ #endif #endif /* __KERNEL__ */ +#ifdef __INSIDE_CYGWIN__ +# include <inttypes.h> +# ifndef __UD_STANDALONE__ +# define __UD_STANDALONE__ 1 +# endif +#endif /* __INSIDE_CYGWIN__ */ + + #if defined(_MSC_VER) || defined(__BORLANDC__) # include <stdint.h> # include <stdio.h> @@ -221,8 +229,8 @@ struct ud uint8_t modrm; uint8_t primary_opcode; void * user_opaque_data; - struct ud_itab_entry * itab_entry; - struct ud_lookup_table_list_entry *le; + const struct ud_itab_entry * itab_entry; + const struct ud_lookup_table_list_entry *le; }; /* ----------------------------------------------------------------------------- @@ -235,8 +243,10 @@ typedef enum ud_mnemonic_code ud_mnemonic_code_t; typedef struct ud ud_t; typedef struct ud_operand ud_operand_t; +#ifndef __INSIDE_CYGWIN__ #define UD_SYN_INTEL ud_translate_intel #define UD_SYN_ATT ud_translate_att +#endif /* __INSIDE_CYGWIN__ */ #define UD_EOI (-1) #define UD_INP_CACHE_SZ 32 #define UD_VENDOR_AMD 0 diff --git a/winsup/cygwin/udis86/udint.h b/winsup/cygwin/udis86/udint.h index 2908b613b6..29695476ec 100644 --- a/winsup/cygwin/udis86/udint.h +++ b/winsup/cygwin/udis86/udint.h @@ -26,9 +26,11 @@ #ifndef _UDINT_H_ #define _UDINT_H_ -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif /* HAVE_CONFIG_H */ +#ifndef __INSIDE_CYGWIN__ +# ifdef HAVE_CONFIG_H +# include <config.h> +# endif /* HAVE_CONFIG_H */ +#endif /* __INSIDE_CYGWIN__ */ #if defined(UD_DEBUG) && HAVE_ASSERT_H # include <assert.h> diff --git a/winsup/cygwin/udis86/udis86.c b/winsup/cygwin/udis86/udis86.c index d62af1f3df..53db032b90 100644 --- a/winsup/cygwin/udis86/udis86.c +++ b/winsup/cygwin/udis86/udis86.c @@ -24,8 +24,9 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "udint.h" +#include "winsup.h" #include "extern.h" +#include "udint.h" #include "decode.h" #if !defined(__UD_STANDALONE__) @@ -34,6 +35,10 @@ # endif #endif /* !__UD_STANDALONE__ */ +#ifdef __INSIDE_CYGWIN__ +#define sprintf __small_sprintf +#endif /* __INSIDE_CYGWIN__ */ + static void ud_inp_init(struct ud *u); /* ============================================================================= @@ -324,6 +329,7 @@ ud_insn_mnemonic(const struct ud *u) } +#ifndef __INSIDE_CYGWIN__ /* ============================================================================= * ud_lookup_mnemonic * Looks up mnemonic code in the mnemonic string table. @@ -339,6 +345,7 @@ ud_lookup_mnemonic(enum ud_mnemonic_code c) return NULL; } } +#endif /* __INSIDE_CYGWIN__ */ /* -- 2.48.1.windows.1