| /* | |
| * Copyright 1993 Robert J. Amstadt | |
| * Copyright 1995 Martin von Loewis | |
| * Copyright 1995, 1996, 1997 Alexandre Julliard | |
| * Copyright 1997 Eric Youngdale | |
| * Copyright 1999 Ulrich Weigand | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Lesser General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2.1 of the License, or (at your option) any later version. | |
| * | |
| * This library 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 | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public | |
| * License along with this library; if not, write to the Free Software | |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | |
| */ | |
| #ifndef __WINE_BUILD_H | |
| #define __WINE_BUILD_H | |
| #ifndef __WINE_CONFIG_H | |
| # error You must include config.h to use this header | |
| #endif | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| #ifndef max | |
| #define max(a,b) (((a) > (b)) ? (a) : (b)) | |
| #endif | |
| #ifndef min | |
| #define min(a,b) (((a) < (b)) ? (a) : (b)) | |
| #endif | |
| typedef enum | |
| { | |
| TYPE_VARIABLE, /* variable */ | |
| TYPE_PASCAL, /* pascal function (Win16) */ | |
| TYPE_ABS, /* absolute value (Win16) */ | |
| TYPE_STUB, /* unimplemented stub */ | |
| TYPE_STDCALL, /* stdcall function (Win32) */ | |
| TYPE_CDECL, /* cdecl function (Win32) */ | |
| TYPE_VARARGS, /* varargs function (Win32) */ | |
| TYPE_THISCALL, /* thiscall function (Win32 on i386) */ | |
| TYPE_EXTERN, /* external symbol (Win32) */ | |
| TYPE_NBTYPES | |
| } ORD_TYPE; | |
| typedef enum | |
| { | |
| SPEC_WIN16, | |
| SPEC_WIN32 | |
| } SPEC_TYPE; | |
| enum arg_type | |
| { | |
| ARG_WORD, /* 16-bit word */ | |
| ARG_SWORD, /* 16-bit signed word */ | |
| ARG_SEGPTR, /* segmented pointer */ | |
| ARG_SEGSTR, /* segmented pointer to Ansi string */ | |
| ARG_LONG, /* long */ | |
| ARG_PTR, /* pointer */ | |
| ARG_STR, /* pointer to Ansi string */ | |
| ARG_WSTR, /* pointer to Unicode string */ | |
| ARG_INT64, /* 64-bit integer */ | |
| ARG_INT128, /* 128-bit integer */ | |
| ARG_FLOAT, /* 32-bit float */ | |
| ARG_DOUBLE, /* 64-bit float */ | |
| ARG_MAXARG = ARG_DOUBLE | |
| }; | |
| #define MAX_ARGUMENTS 32 | |
| typedef struct | |
| { | |
| int n_values; | |
| unsigned int *values; | |
| } ORD_VARIABLE; | |
| typedef struct | |
| { | |
| int nb_args; | |
| enum arg_type args[MAX_ARGUMENTS]; | |
| } ORD_FUNCTION; | |
| typedef struct | |
| { | |
| unsigned short value; | |
| } ORD_ABS; | |
| typedef struct | |
| { | |
| ORD_TYPE type; | |
| int ordinal; | |
| int lineno; | |
| int flags; | |
| char *name; /* public name of this function */ | |
| char *link_name; /* name of the C symbol to link to */ | |
| char *export_name; /* name exported under for noname exports */ | |
| union | |
| { | |
| ORD_VARIABLE var; | |
| ORD_FUNCTION func; | |
| ORD_ABS abs; | |
| } u; | |
| } ORDDEF; | |
| typedef struct | |
| { | |
| char *src_name; /* file name of the source spec file */ | |
| char *file_name; /* file name of the dll */ | |
| char *dll_name; /* internal name of the dll */ | |
| char *c_name; /* internal name of the dll, as a C-compatible identifier */ | |
| char *init_func; /* initialization routine */ | |
| char *main_module; /* main Win32 module for Win16 specs */ | |
| SPEC_TYPE type; /* type of dll (Win16/Win32) */ | |
| int base; /* ordinal base */ | |
| int limit; /* ordinal limit */ | |
| int stack_size; /* exe stack size */ | |
| int heap_size; /* exe heap size */ | |
| int nb_entry_points; /* number of used entry points */ | |
| int alloc_entry_points; /* number of allocated entry points */ | |
| int nb_names; /* number of entry points with names */ | |
| unsigned int nb_resources; /* number of resources */ | |
| int characteristics; /* characteristics for the PE header */ | |
| int dll_characteristics;/* DLL characteristics for the PE header */ | |
| int subsystem; /* subsystem id */ | |
| int subsystem_major; /* subsystem version major number */ | |
| int subsystem_minor; /* subsystem version minor number */ | |
| ORDDEF *entry_points; /* dll entry points */ | |
| ORDDEF **names; /* array of entry point names (points into entry_points) */ | |
| ORDDEF **ordinals; /* array of dll ordinals (points into entry_points) */ | |
| struct resource *resources; /* array of dll resources (format differs between Win16/Win32) */ | |
| } DLLSPEC; | |
| enum target_cpu | |
| { | |
| CPU_x86, CPU_x86_64, CPU_POWERPC, CPU_ARM, CPU_ARM64, CPU_LAST = CPU_ARM64 | |
| }; | |
| enum target_platform | |
| { | |
| PLATFORM_UNSPECIFIED, | |
| PLATFORM_APPLE, | |
| PLATFORM_FREEBSD, | |
| PLATFORM_SOLARIS, | |
| PLATFORM_WINDOWS | |
| }; | |
| extern char *target_alias; | |
| extern enum target_cpu target_cpu; | |
| extern enum target_platform target_platform; | |
| struct strarray | |
| { | |
| const char **str; | |
| unsigned int count; | |
| unsigned int max; | |
| }; | |
| /* entry point flags */ | |
| #define FLAG_NORELAY 0x01 /* don't use relay debugging for this function */ | |
| #define FLAG_NONAME 0x02 /* don't export function by name */ | |
| #define FLAG_RET16 0x04 /* function returns a 16-bit value */ | |
| #define FLAG_RET64 0x08 /* function returns a 64-bit value */ | |
| #define FLAG_REGISTER 0x10 /* use register calling convention */ | |
| #define FLAG_PRIVATE 0x20 /* function is private (cannot be imported) */ | |
| #define FLAG_ORDINAL 0x40 /* function should be imported by ordinal */ | |
| #define FLAG_FORWARD 0x100 /* function is a forwarded name */ | |
| #define FLAG_EXT_LINK 0x200 /* function links to an external symbol */ | |
| #define FLAG_EXPORT32 0x400 /* 32-bit export in 16-bit spec file */ | |
| #define FLAG_CPU(cpu) (0x01000 << (cpu)) | |
| #define FLAG_CPU_MASK (FLAG_CPU(CPU_LAST + 1) - FLAG_CPU(0)) | |
| #define FLAG_CPU_WIN64 (FLAG_CPU(CPU_x86_64) | FLAG_CPU(CPU_ARM64)) | |
| #define FLAG_CPU_WIN32 (FLAG_CPU_MASK & ~FLAG_CPU_WIN64) | |
| #define MAX_ORDINALS 65535 | |
| /* some Windows constants */ | |
| #define IMAGE_FILE_RELOCS_STRIPPED 0x0001 /* No relocation info */ | |
| #define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 | |
| #define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 | |
| #define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 | |
| #define IMAGE_FILE_AGGRESIVE_WS_TRIM 0x0010 | |
| #define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020 | |
| #define IMAGE_FILE_16BIT_MACHINE 0x0040 | |
| #define IMAGE_FILE_BYTES_REVERSED_LO 0x0080 | |
| #define IMAGE_FILE_32BIT_MACHINE 0x0100 | |
| #define IMAGE_FILE_DEBUG_STRIPPED 0x0200 | |
| #define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400 | |
| #define IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800 | |
| #define IMAGE_FILE_SYSTEM 0x1000 | |
| #define IMAGE_FILE_DLL 0x2000 | |
| #define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000 | |
| #define IMAGE_FILE_BYTES_REVERSED_HI 0x8000 | |
| #define IMAGE_DLLCHARACTERISTICS_NX_COMPAT 0x0100 | |
| #define IMAGE_SUBSYSTEM_NATIVE 1 | |
| #define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 | |
| #define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 | |
| #define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9 | |
| /* global functions */ | |
| #ifndef __GNUC__ | |
| #define __attribute__(X) | |
| #endif | |
| #ifndef DECLSPEC_NORETURN | |
| # if defined(_MSC_VER) && (_MSC_VER >= 1200) && !defined(MIDL_PASS) | |
| # define DECLSPEC_NORETURN __declspec(noreturn) | |
| # else | |
| # define DECLSPEC_NORETURN __attribute__((noreturn)) | |
| # endif | |
| #endif | |
| extern void *xmalloc (size_t size); | |
| extern void *xrealloc (void *ptr, size_t size); | |
| extern char *xstrdup( const char *str ); | |
| extern char *strupper(char *s); | |
| extern int strendswith(const char* str, const char* end); | |
| extern char *strmake(const char* fmt, ...) __attribute__((__format__ (__printf__, 1, 2 ))); | |
| extern struct strarray strarray_fromstring( const char *str, const char *delim ); | |
| extern void strarray_add( struct strarray *array, ... ); | |
| extern void strarray_addv( struct strarray *array, char * const *argv ); | |
| extern void strarray_addall( struct strarray *array, struct strarray args ); | |
| extern DECLSPEC_NORETURN void fatal_error( const char *msg, ... ) | |
| __attribute__ ((__format__ (__printf__, 1, 2))); | |
| extern DECLSPEC_NORETURN void fatal_perror( const char *msg, ... ) | |
| __attribute__ ((__format__ (__printf__, 1, 2))); | |
| extern void error( const char *msg, ... ) | |
| __attribute__ ((__format__ (__printf__, 1, 2))); | |
| extern void warning( const char *msg, ... ) | |
| __attribute__ ((__format__ (__printf__, 1, 2))); | |
| extern int output( const char *format, ... ) | |
| __attribute__ ((__format__ (__printf__, 1, 2))); | |
| extern void output_cfi( const char *format, ... ) | |
| __attribute__ ((__format__ (__printf__, 1, 2))); | |
| extern void spawn( struct strarray array ); | |
| extern struct strarray find_tool( const char *name, const char * const *names ); | |
| extern struct strarray get_as_command(void); | |
| extern struct strarray get_ld_command(void); | |
| extern const char *get_nm_command(void); | |
| extern void cleanup_tmp_files(void); | |
| extern char *get_temp_file_name( const char *prefix, const char *suffix ); | |
| extern void output_standard_file_header(void); | |
| extern FILE *open_input_file( const char *srcdir, const char *name ); | |
| extern void close_input_file( FILE *file ); | |
| extern void dump_bytes( const void *buffer, unsigned int size ); | |
| extern int remove_stdcall_decoration( char *name ); | |
| extern void assemble_file( const char *src_file, const char *obj_file ); | |
| extern DLLSPEC *alloc_dll_spec(void); | |
| extern void free_dll_spec( DLLSPEC *spec ); | |
| extern char *make_c_identifier( const char *str ); | |
| extern const char *get_stub_name( const ORDDEF *odp, const DLLSPEC *spec ); | |
| extern int get_cpu_from_name( const char *name ); | |
| extern unsigned int get_alignment(unsigned int align); | |
| extern unsigned int get_page_size(void); | |
| extern unsigned int get_ptr_size(void); | |
| extern unsigned int get_args_size( const ORDDEF *odp ); | |
| extern const char *asm_name( const char *func ); | |
| extern const char *func_declaration( const char *func ); | |
| extern const char *asm_globl( const char *func ); | |
| extern const char *get_asm_ptr_keyword(void); | |
| extern const char *get_asm_string_keyword(void); | |
| extern const char *get_asm_rodata_section(void); | |
| extern const char *get_asm_string_section(void); | |
| extern void output_function_size( const char *name ); | |
| extern void output_gnu_stack_note(void); | |
| extern void add_import_dll( const char *name, const char *filename ); | |
| extern void add_delayed_import( const char *name ); | |
| extern void add_extra_ld_symbol( const char *name ); | |
| extern void read_undef_symbols( DLLSPEC *spec, char **argv ); | |
| extern void resolve_imports( DLLSPEC *spec ); | |
| extern int is_undefined( const char *name ); | |
| extern int has_imports(void); | |
| extern void output_get_pc_thunk(void); | |
| extern void output_module( DLLSPEC *spec ); | |
| extern void output_stubs( DLLSPEC *spec ); | |
| extern void output_imports( DLLSPEC *spec ); | |
| extern void output_import_lib( DLLSPEC *spec, char **argv ); | |
| extern void output_exports( DLLSPEC *spec ); | |
| extern int load_res32_file( const char *name, DLLSPEC *spec ); | |
| extern void output_resources( DLLSPEC *spec ); | |
| extern void output_bin_resources( DLLSPEC *spec, unsigned int start_rva ); | |
| extern void output_fake_module( DLLSPEC *spec ); | |
| extern void output_def_file( DLLSPEC *spec, int include_private ); | |
| extern void load_res16_file( const char *name, DLLSPEC *spec ); | |
| extern void output_res16_data( DLLSPEC *spec ); | |
| extern void output_bin_res16_data( DLLSPEC *spec ); | |
| extern void output_res16_directory( DLLSPEC *spec ); | |
| extern void output_bin_res16_directory( DLLSPEC *spec, unsigned int data_offset ); | |
| extern void output_spec16_file( DLLSPEC *spec ); | |
| extern void output_fake_module16( DLLSPEC *spec16 ); | |
| extern void output_res_o_file( DLLSPEC *spec ); | |
| extern void output_asm_relays16(void); | |
| extern void BuildSpec32File( DLLSPEC *spec ); | |
| extern void add_16bit_exports( DLLSPEC *spec32, DLLSPEC *spec16 ); | |
| extern int parse_spec_file( FILE *file, DLLSPEC *spec ); | |
| extern int parse_def_file( FILE *file, DLLSPEC *spec ); | |
| /* buffer management */ | |
| extern int byte_swapped; | |
| extern const char *input_buffer_filename; | |
| extern const unsigned char *input_buffer; | |
| extern size_t input_buffer_pos; | |
| extern size_t input_buffer_size; | |
| extern unsigned char *output_buffer; | |
| extern size_t output_buffer_pos; | |
| extern size_t output_buffer_size; | |
| extern void init_input_buffer( const char *file ); | |
| extern void init_output_buffer(void); | |
| extern void flush_output_buffer(void); | |
| extern unsigned char get_byte(void); | |
| extern unsigned short get_word(void); | |
| extern unsigned int get_dword(void); | |
| extern void put_data( const void *data, size_t size ); | |
| extern void put_byte( unsigned char val ); | |
| extern void put_word( unsigned short val ); | |
| extern void put_dword( unsigned int val ); | |
| extern void put_qword( unsigned int val ); | |
| extern void put_pword( unsigned int val ); | |
| extern void align_output( unsigned int align ); | |
| /* global variables */ | |
| extern int current_line; | |
| extern int UsePIC; | |
| extern int nb_errors; | |
| extern int display_warnings; | |
| extern int kill_at; | |
| extern int verbose; | |
| extern int link_ext_symbols; | |
| extern int force_pointer_size; | |
| extern int unwind_tables; | |
| extern char *input_file_name; | |
| extern char *spec_file_name; | |
| extern FILE *output_file; | |
| extern const char *output_file_name; | |
| extern struct strarray lib_path; | |
| extern struct strarray as_command; | |
| extern struct strarray cc_command; | |
| extern struct strarray ld_command; | |
| extern struct strarray nm_command; | |
| extern char *cpu_option; | |
| extern char *arch_option; | |
| extern int thumb_mode; | |
| extern int needs_get_pc_thunk; | |
| #endif /* __WINE_BUILD_H */ |