jwasm/H/globals.h
2015-07-28 01:04:43 +03:00

874 lines
31 KiB
C

/****************************************************************************
*
* Open Watcom Project
*
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
* ========================================================================
*
* This file contains Original Code and/or Modifications of Original
* Code as defined in and that are subject to the Sybase Open Watcom
* Public License version 1.0 (the 'License'). You may not use this file
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
* provided with the Original Code and Modifications, and is also
* available at www.sybase.com/developer/opensource.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
* NON-INFRINGEMENT. Please see the License for the specific language
* governing rights and limitations under the License.
*
* ========================================================================
*
* Description: JWasm globals and limits.
*
****************************************************************************/
#ifndef _GLOBALS_H_INCLUDED
#define _GLOBALS_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h> /* needed for errno declaration ( "sometimes" it's defined in stdlib.h ) */
#if defined(__UNIX__) || defined(__CYGWIN__) || defined(__DJGPP__) /* avoid for MinGW! */
extern char * strupr(char *);
#define _stricmp strcasecmp
#ifndef __WATCOMC__
#define _memicmp strncasecmp
#endif
#define _ltoa ltoa
#define _strupr strupr
#elif defined(__POCC__)
#pragma warn(disable:2030) /* disable '=' used in a conditional expression */
#pragma warn(disable:2229) /* disable 'local x is potentially used without ...' */
#pragma warn(disable:2231) /* disable 'enum value x not handled in switch statement' */
#elif defined(__BORLANDC__) || defined(__OCC__)
#define _stricmp stricmp
#define _strnicmp strnicmp
#define _strupr strupr
#define _memicmp memicmp
#endif
#define MAX_LINE_LEN 600 /* no restriction for this number */
#define MAX_TOKEN MAX_LINE_LEN / 4 /* max tokens in one line */
#define MAX_STRING_LEN MAX_LINE_LEN - 32 /* must be < MAX_LINE_LEN */
#define MAX_ID_LEN 247 /* must be < MAX_LINE_LEN */
#define MAX_STRUCT_ALIGN 32
/* v2.06: obsolete */
//#define MAX_RESW_LEN 31 /* max length of a reserved word */
#define MAX_IF_NESTING 20 /* IFxx block nesting. Must be <=32, see condasm.c */
//#define MAX_TEXTMACRO_NESTING 20
#define MAX_SEG_NESTING 20 /* limit for segment nesting */
#ifdef __I86__
#define MAX_MACRO_NESTING 20
#else
#define MAX_MACRO_NESTING 40 /* macro call nesting */
#endif
#define MAX_STRUCT_NESTING 32 /* limit for "anonymous structs" only */
#define MAX_LNAME 255 /* OMF lnames - length must fit in 1 byte */
#define LNAME_NULL 0 /* OMF first entry in lnames array */
/* output format switches */
#ifndef BIN_SUPPORT
#define BIN_SUPPORT 1 /* support BIN output format */
#endif
#if BIN_SUPPORT
#ifndef MZ_SUPPORT
#define MZ_SUPPORT 1 /* support DOS MZ binary format */
#endif
#ifndef PE_SUPPORT
#define PE_SUPPORT 1 /* support PE32 + PE64 binary format */
#endif
#else
#define MZ_SUPPORT 0 /* both MZ and PE need BIN==1 */
#define PE_SUPPORT 0
#endif
#ifndef COFF_SUPPORT
#define COFF_SUPPORT 1 /* support COFF output format */
#endif
#ifndef DJGPP_SUPPORT
#define DJGPP_SUPPORT 0 /* support for Djgpp COFF variant */
#endif
#ifndef ELF_SUPPORT
#define ELF_SUPPORT 1 /* support ELF output format */
#endif
/* instruction set switches */
#define K3DSUPP 1 /* support K3D instruction set */
#define SSE3SUPP 1 /* support SSE3 instruction set */
#ifndef AMD64_SUPPORT
#define AMD64_SUPPORT 1 /* 1=support 64bit */
#endif
#ifndef VMXSUPP
#define VMXSUPP 1 /* support VMX extensions */
#endif
#ifndef SVMSUPP
#define SVMSUPP 0 /* support SVM (=AMD-V) extensions */
#endif
#ifndef SSSE3SUPP
#define SSSE3SUPP 1 /* support SSSE3 instruction set */
#endif
#ifndef SSE4SUPP
#define SSE4SUPP 1 /* support SSE4 instruction set */
#endif
#ifndef AVXSUPP
#define AVXSUPP 1 /* support AVX extensions */
#endif
#ifndef COMDATSUPP
#define COMDATSUPP 1 /* support COMDAT segment attribute */
#endif
/* other extension switches */
#define IMAGERELSUPP 1 /* support IMAGEREL operator (not for OMF) */
#define SECTIONRELSUPP 1 /* support SECTIONREL operator (not for OMF) */
#define FIELDALIGN 1 /* support OPTION FIELDALIGN:<const> */
#define PROCALIGN 1 /* support OPTION PROCALIGN:<const> */
#define LOHI32 1 /* support LOW32/HIGH32 operators */
#define XMMWORD 1 /* support MMWORD and XMMWORD types */
#define RENAMEKEY 1 /* support OPTION RENAMEKEYWORD:<old>,new */
#define MACROLABEL 1 /* support LABEL qualifier for macro arg */
#define BACKQUOTES 1 /* allow IDs enclosed in ` */
#define FPIMMEDIATE 1 /* allow float immediates: mov eax,1.0 */
#define INCBINSUPP 1 /* support INCBIN directive */
#define INTELMOVQ 0 /* 1=MOVQ moves to/from 64-bit registers */
#ifndef OWFC_SUPPORT
#define OWFC_SUPPORT 1 /* support OW fastcall flavor */
#endif
#ifndef DLLIMPORT
#define DLLIMPORT 1 /* support OPTION DLLIMPORT */
#endif
#ifndef CVOSUPP
#define CVOSUPP 1 /* support OPTION CODEVIEW */
#endif
#define MASM_SSE_MEMX 1 /* support 2 mem types for mmx/xmm */
#define PERCENT_OUT 1 /* 1=support %OUT directive */
#ifndef STACKBASESUPP
#define STACKBASESUPP 1 /* support OPTION STACKBASE */
#endif
#define VARARGML 1 /* multi line vararg for macros */
/* old Wasm extensions */
#define PAGE4K 0 /* support 4kB-page OMF segment alignment */
#define BUILD_TARGET 0 /* support "build target" (obsolete) */
#define COCTALS 0 /* allow C form of octals */
#define CHEXPREFIX 0 /* accept "0x" as hex number prefix */
#define MANGLERSUPP 0 /* support Wasm's "mangler" extension */
/* internal assembler optimizations */
#ifndef FASTPASS
#define FASTPASS 1 /* don't scan full source if pass > 1 */
#endif
#ifndef FASTMEM
#define FASTMEM 1 /* fast memory allocation */
#endif
#include "inttype.h"
#include "bool.h"
#include "errmsg.h" /* must be located AFTER #defines lines */
#include "queue.h"
/* JWasm version info */
#define _JWASM_VERSION_STR_ "2.12"
#define _JWASM_VERSION_INT_ 212
#define _JWASM_VERSION_SUFFIX_ "pre"
#define _JWASM_VERSION_ _JWASM_VERSION_STR_ _JWASM_VERSION_SUFFIX_
#define NULLC '\0'
//#define NULLS ""
#define is_valid_id_char( ch ) ( isalnum(ch) || ch=='_' || ch=='@' || ch=='$' || ch=='?' )
#define is_valid_id_first_char( ch ) ( isalpha(ch) || ch=='_' || ch=='@' || ch=='$' || ch=='?' || (ch == '.' && ModuleInfo.dotname == TRUE ))
/* function return values */
typedef enum {
EMPTY = -2,
ERROR = -1,
NOT_ERROR = 0,
STRING_EXPANDED = 1
} ret_code;
enum {
PASS_1 = 0,
PASS_2
};
/* enumerations */
/* output formats. Order must match formatoptions[] in assemble.c */
enum oformat {
#if BIN_SUPPORT
OFORMAT_BIN, /* used by -bin, -mz and -pe */
#endif
OFORMAT_OMF,
#if COFF_SUPPORT
OFORMAT_COFF,/* used by -coff, -djgpp and -win64 */
#endif
#if ELF_SUPPORT
OFORMAT_ELF, /* used by -elf and elf64 */
#endif
};
enum sformat {
SFORMAT_NONE,
#if MZ_SUPPORT
SFORMAT_MZ, /* MZ binary */
#endif
#if PE_SUPPORT
SFORMAT_PE, /* PE (32- or 64-bit) binary */
#endif
#if COFF_SUPPORT
#if DJGPP_SUPPORT
SFORMAT_DJGPP, /* Djgpp variant of COFF */
#endif
#endif
#if COFF_SUPPORT || ELF_SUPPORT
#if AMD64_SUPPORT
SFORMAT_64BIT, /* 64bit COFF or ELF */
#endif
#endif
};
enum fpo {
FPO_NO_EMULATION, /* -FPi87 (default) */
FPO_EMULATION /* -FPi */
};
/* language vaules.
* the order cannot be changed, it's
* returned by OPATTR and used in user-defined prologue/epilogue.
*/
enum lang_type {
LANG_NONE = 0,
LANG_C = 1,
LANG_SYSCALL = 2,
LANG_STDCALL = 3,
LANG_PASCAL = 4,
LANG_FORTRAN = 5,
LANG_BASIC = 6,
LANG_FASTCALL = 7
};
/* Memory model type.
* the order cannot be changed, it's
* the value of the predefined @Model symbol.
*/
enum model_type {
MODEL_NONE = 0,
MODEL_TINY = 1,
MODEL_SMALL = 2,
MODEL_COMPACT = 3,
MODEL_MEDIUM = 4,
MODEL_LARGE = 5,
MODEL_HUGE = 6,
MODEL_FLAT = 7,
};
#define SIZE_DATAPTR 0x68 /* far for COMPACT, LARGE, HUGE */
#define SIZE_CODEPTR 0x70 /* far for MEDIUM, LARGE, HUGE */
enum seg_order {
SEGORDER_SEQ = 0, /* .SEQ (default) */
SEGORDER_DOSSEG, /* .DOSSEG */
SEGORDER_ALPHA /* .ALPHA */
};
/* .NOLISTMACRO, .LISTMACRO and .LISTMACROALL directives setting */
enum listmacro {
LM_NOLISTMACRO,
LM_LISTMACRO,
LM_LISTMACROALL
};
/* assume values are used as index in codegen.c / invoke.c.
* Order must match the one in special.h. Don't change!
*/
enum assume_segreg {
ASSUME_NOTHING = EMPTY,
ASSUME_ES = 0,
ASSUME_CS,
ASSUME_SS,
ASSUME_DS,
ASSUME_FS,
ASSUME_GS
};
enum cpu_info {
/* bit count from left:
* bit 0-2: Math coprocessor
* bit 3: privileged?
* bit 4-7: cpu type
* bit 8-15; extension set
*/
P_NO87 = 0x0001, /* no FPU */
P_87 = 0x0002, /* 8087 */
P_287 = 0x0003, /* 80287 */
P_387 = 0x0004, /* 80387 */
P_PM = 0x0008, /* privileged opcode */
P_86 = 0x0000, /* 8086, default */
P_186 = 0x0010, /* 80186 */
P_286 = 0x0020, /* 80286 */
P_386 = 0x0030, /* 80386 */
P_486 = 0x0040, /* 80486 */
P_586 = 0x0050, /* pentium */
P_686 = 0x0060, /* ppro */
#if AMD64_SUPPORT
P_64 = 0x0070, /* x64 cpu */
#endif
P_286p = P_286 | P_PM, /* 286, priv mode */
P_386p = P_386 | P_PM, /* 386, priv mode */
P_486p = P_486 | P_PM, /* 486, priv mode */
P_586p = P_586 | P_PM, /* 586, priv mode */
P_686p = P_686 | P_PM, /* 686, priv mode */
#if AMD64_SUPPORT
P_64p = P_64 | P_PM, /* x64, priv mode */
#endif
P_MMX = 0x0100, /* MMX extension instructions */
#if K3DSUPP
P_K3D = 0x0200, /* 3DNow extension instructions */
#endif
P_SSE1 = 0x0400, /* SSE1 extension instructions */
P_SSE2 = 0x0800, /* SSE2 extension instructions */
P_SSE3 = 0x1000, /* SSE3 extension instructions */
#if SSSE3SUPP
P_SSSE3 = 0x2000, /* SSSE3 extension instructions */
#if SSE4SUPP
P_SSE4 = 0x4000, /* SSE4 extension instructions */
#if AVXSUPP
P_AVX = 0x8000, /* AVX extension instructions */
#endif
#endif
#endif
/* all SSE extension instructions */
#if SSSE3SUPP
#if SSE4SUPP
#if AVXSUPP
P_SSEALL = P_SSE1 | P_SSE2 | P_SSE3 | P_SSSE3 | P_SSE4 | P_AVX,
#else
P_SSEALL = P_SSE1 | P_SSE2 | P_SSE3 | P_SSSE3 | P_SSE4,
#endif
#else
P_SSEALL = P_SSE1 | P_SSE2 | P_SSE3 | P_SSSE3,
#endif
#else
P_SSEALL = P_SSE1 | P_SSE2 | P_SSE3,
#endif
NO_OPPRFX = P_MMX | P_SSEALL,
P_FPU_MASK = 0x0007,
P_CPU_MASK = 0x00F0,
#if K3DSUPP
P_EXT_MASK = P_MMX | P_K3D | P_SSEALL,
P_EXT_ALL = P_MMX | P_K3D | P_SSEALL
#else
P_EXT_MASK = P_MMX | P_SSEALL,
P_EXT_ALL = P_MMX | P_SSEALL
#endif
};
/* the MASM compatible @CPU value flags: */
enum masm_cpu {
M_8086 = 0x0001, /* 8086 */
M_186 = 0x0002, /* 186 */
M_286 = 0x0004, /* 286 */
M_386 = 0x0008, /* 386 */
M_486 = 0x0010, /* 486 */
M_586 = 0x0020, /* Pentium */
M_686 = 0x0040, /* PPro */
M_CPUMSK = 0x007F,
M_PROT = 0x0080, /* protected instructions ok */
M_8087 = 0x0100, /* 8087 */
M_287 = 0x0400, /* 287 */
M_387 = 0x0800 /* 387 */
};
#if MANGLERSUPP
enum naming_types {
NC_DO_NOTHING,
/* put uscores on the front of labels & the back of procedures.
* this is what the OW compiler does with /3r
*/
NC_ADD_USCORES,
/* assume that the user manually put uscores as described above
* into the assembly file and take them off
*/
NC_REMOVE_USCORES
};
#endif
enum segofssize {
USE_EMPTY = 0xFE,
USE16 = 0, /* don't change values of USE16,USE32,USE64! */
USE32 = 1,
#if AMD64_SUPPORT
USE64 = 2
#endif
};
/* fastcall types. if order is to be changed or entries
* added, also adjust tables in proc.c, mangle.c and probably invoke.c!
*/
enum fastcall_type {
FCT_MSC, /* MS 16-/32-bit fastcall (ax,dx,cx / ecx,edx) */
#if OWFC_SUPPORT
FCT_WATCOMC, /* OW register calling convention (eax, ebx, ecx, edx) */
#endif
#if AMD64_SUPPORT
FCT_WIN64 /* Win64 fastcall convention (rcx, rdx, r8, r9) */
#endif
};
enum stdcall_decoration {
STDCALL_FULL,
STDCALL_NONE,
STDCALL_HALF
};
struct qitem {
void *next;
char value[1];
};
/* file extensions. Order must match first entries in enum opt_names! */
enum file_extensions {
ASM, /* must be first; see SetFilenames() in assembly.c */
OBJ,
LST,
ERR,
NUM_FILE_TYPES
};
/* first 4 entries must match enum file_extensions! */
enum opt_names {
OPTN_ASM_FN,
OPTN_OBJ_FN, /* -Fo option */
OPTN_LST_FN, /* -Fl option */
OPTN_ERR_FN, /* -Fr option */
#if DLLIMPORT
OPTN_LNKDEF_FN, /* -Fd option */
#endif
OPTN_MODULE_NAME, /* -nm option */
OPTN_TEXT_SEG, /* -nt option */
OPTN_DATA_SEG, /* -nd option */
OPTN_CODE_CLASS, /* -nc option */
#if BUILD_TARGET
OPTN_BUILD_TARGET, /* -bt option */
#endif
#if MANGLERSUPP
OPTN_DEFNAME_MANGLER,
#endif
OPTN_LAST
};
/* queues to store multiple cmdline switch values */
enum opt_queues {
OPTQ_FINCLUDE, /* -Fi option values */
OPTQ_MACRO, /* -D option values */
OPTQ_INCPATH, /* -I option values */
OPTQ_LAST
};
enum prologue_epilogue_mode {
PEM_DEFAULT, /* must be value 0 */
PEM_MACRO,
PEM_NONE
};
/* Stack distance */
enum dist_type {
//STACK_NONE,
STACK_NEAR,
STACK_FAR,
};
/* Type of operating system */
enum os_type {
OPSYS_DOS,
OPSYS_OS2,
};
enum offset_type {
OT_GROUP = 0, /* OFFSET:GROUP (default, must be 0) */
OT_FLAT, /* OFFSET:FLAT */
OT_SEGMENT /* OFFSET:SEGMENT */
};
enum line_output_flags {
LOF_LISTED = 1, /* line written to .LST file */
#if FASTPASS
LOF_SKIPPOS = 2, /* suppress setting list_pos */
//LOF_STORED = 2 /* line stored in line buffer for FASTPASS */
#endif
};
/* flags for win64_flags */
enum win64_flag_values {
W64F_SAVEREGPARAMS = 0x01, /* 1=save register params in shadow space on proc entry */
W64F_AUTOSTACKSP = 0x02, /* 1=calculate required stack space for arguments of INVOKE */
W64F_STACKALIGN16 = 0x04, /* 1=stack variables are 16-byte aligned; added in v2.12 */
W64F_ALL = W64F_SAVEREGPARAMS | W64F_AUTOSTACKSP | W64F_STACKALIGN16, /* all valid flags */
};
/* codeview debug info extend */
enum cvex_values {
CVEX_MIN = 0, /* globals */
CVEX_REDUCED = 1, /* globals and locals */
CVEX_NORMAL = 2, /* globals, locals and types */
CVEX_MAX = 3, /* globals, locals, types and constants */
};
/* codeview debug info option flags */
enum cvoption_flags {
CVO_STATICTLS = 1, /* handle static tls */
};
enum seg_type {
SEGTYPE_UNDEF,
SEGTYPE_CODE,
SEGTYPE_DATA,
SEGTYPE_BSS,
SEGTYPE_STACK,
SEGTYPE_ABS,
#if PE_SUPPORT
SEGTYPE_HDR, /* only used in bin.c for better sorting */
SEGTYPE_CDATA, /* only used in bin.c for better sorting */
SEGTYPE_RELOC, /* only used in bin.c for better sorting */
SEGTYPE_RSRC, /* only used in bin.c for better sorting */
SEGTYPE_ERROR, /* must be last - an "impossible" segment type */
#endif
};
struct global_options {
bool quiet; /* -q option */
bool line_numbers; /* -Zd option */
uint_8 debug_symbols; /* -Zi option */
uint_8 debug_ext; /* -Zi option numeric argument */
enum fpo floating_point; /* -FPi, -FPi87 */
/* error handling stuff */
int error_limit; /* -e option */
uint_8 no_error_disp; /* -eq option */
uint_8 warning_level; /* -Wn option */
bool warning_error; /* -WX option */
#ifdef DEBUG_OUT
bool debug; /* -dt option */
bool nobackpatch; /* -nbp option */
#if FASTPASS
bool nofastpass; /* -nfp option */
bool print_linestore; /* -ls option */
#endif
uint_16 max_passes; /* -pm option */
bool skip_preprocessor; /* -sp option */
bool log_all_files; /* -af option */
bool dump_reswords; /* -dr option */
bool dump_reswords_hash; /* -drh option */
bool dump_symbols; /* -ds option */
bool dump_symbols_hash; /* -dsh option */
#endif
char *names[OPTN_LAST];
struct qitem *queues[OPTQ_LAST];
#if COCTALS
bool allow_c_octals; /* -o option */
#endif
bool no_comment_data_in_code_records; /* -zlc option */
bool no_opt_farcall; /* -zld option */
// bool no_dependencies; /* -zld option */
#if COFF_SUPPORT
bool no_file_entry; /* -zlf option */
bool no_static_procs; /* -zlp option */
bool no_section_aux_entry; /* -zls option */
#endif
bool no_cdecl_decoration; /* -zcw & -zcm option */
uint_8 stdcall_decoration; /* -zt<0|1|2> option */
bool no_export_decoration; /* -zze option */
bool entry_decorated; /* -zzs option */
bool write_listing; /* -Fl option */
bool write_impdef; /* -Fd option */
bool case_sensitive; /* -C<p|x|u> options */
bool convert_uppercase; /* -C<p|x|u> options */
bool preprocessor_stdout; /* -EP option */
bool masm51_compat; /* -Zm option */
bool strict_masm_compat; /* -Zne option */
bool masm_compat_gencode; /* -Zg option */
bool masm8_proc_visibility; /* -Zv8 option */
bool listif; /* -Sx, -Sa option */
bool list_generated_code; /* -Sg, -Sa option */
enum listmacro list_macro; /* -Sa option */
bool no_symbol_listing; /* -Sn option */
bool first_pass_listing; /* -Sf option */
bool all_symbols_public; /* -Zf option */
bool safeseh; /* -safeseh option */
uint_8 ignore_include; /* -X option */
enum oformat output_format; /* -bin, -omf, -coff, -elf options */
enum sformat sub_format; /* -mz, -pe, -win64, -elf64 options */
uint_8 fieldalign; /* -Zp option */
enum lang_type langtype; /* -Gc|d|z option */
enum model_type model; /* -mt|s|m|c|l|h|f option */
enum cpu_info cpu; /* -0|1|2|3|4|5|6 & -fp{0|2|3|5|6|c} option */
enum fastcall_type fctype; /* -zf0 & -zf1 option */
bool syntax_check_only; /* -Zs option */
#if MANGLERSUPP
enum naming_types naming_convention; /* OW naming peculiarities */
#endif
};
#if MZ_SUPPORT
/* if the structure changes, option.c, SetMZ() might need adjustment! */
struct MZDATA {
uint_16 ofs_fixups; /* offset start fixups */
uint_16 alignment; /* header alignment: 16,32,64,128,256,512 */
uint_16 heapmin;
uint_16 heapmax;
};
#endif
#if DLLIMPORT
struct dll_desc {
struct dll_desc *next;
int cnt; /* a function of this dll was used by INVOKE */
char name[1];
};
#endif
/* Information about the module */
struct src_item;
struct hll_item;
struct context;
struct fname_item {
char *fname;
//char *fullname; /* v2.11: removed */
//time_t mtime; /* v2.11: removed */
#ifdef DEBUG_OUT
unsigned included;
uint_32 lines;
#endif
};
struct module_info;
struct module_vars {
unsigned error_count; /* total of errors so far */
unsigned warning_count; /* total of warnings so far */
unsigned num_segs; /* number of segments in module */
/* v2.07: GlobalQueue is obsolete */
//struct qdesc GlobalQueue; /* GLOBAL items ( =externdefs ) */
struct qdesc PubQueue; /* PUBLIC items */
struct qdesc LnameQueue; /* LNAME items (segments, groups and classes) */
#if COFF_SUPPORT
struct qdesc SafeSEHQueue; /* list of safeseh handlers */
#endif
struct qdesc LibQueue; /* includelibs */
/* v2.11: AltQueue is obsolete */
//struct symbol_queue AltQueue; /* weak externals */
//struct qdesc AltQueue; /* weak externals */
#if DLLIMPORT
struct dll_desc *DllQueue; /* dlls of OPTION DLLIMPORT */
#endif
#if PE_SUPPORT || DLLIMPORT
char *imp_prefix;
#endif
FILE *curr_file[NUM_FILE_TYPES]; /* ASM, ERR, OBJ and LST */
char *curr_fname[NUM_FILE_TYPES];
struct fname_item *FNames; /* array of input files */
unsigned cnt_fnames; /* items in FNames array */
char *IncludePath;
struct qdesc line_queue; /* line queue */
struct src_item *src_stack; /* source item (files & macros) stack */
union {
struct fixup *start_fixup; /* OMF only */
struct asym *start_label; /* non-OMF only: start label */
};
uint_32 start_displ; /* OMF only, optional displ for start label */
struct hll_item *HllStack; /* for .WHILE, .IF, .REPEAT */
struct hll_item *HllFree; /* v2.06: stack of free <struct hll>-items */
struct context *ContextStack;
struct context *ContextFree; /* v2.10: "free items" heap implemented. */
#if FASTPASS
struct context *SavedContexts;
int cntSavedContexts;
#endif
/* v2.10: moved here from module_info due to problems if @@: occured on the very first line */
unsigned anonymous_label; /* "anonymous label" counter */
#if STACKBASESUPP
struct asym *StackBase;
struct asym *ProcStatus;
#endif
ret_code (* WriteModule)( struct module_info * );
ret_code (* EndDirHook)( struct module_info * );
ret_code (* Pass1Checks)( struct module_info * );
#if PE_SUPPORT
uint_8 pe_flags; /* for PE */
#endif
};
struct format_options;
struct module_info {
struct module_vars g;
char *proc_prologue; /* prologue macro if PEM_MACRO */
char *proc_epilogue; /* epilogue macro if PEM_MACRO */
#if DLLIMPORT
struct dll_desc *CurrDll; /* OPTION DLLIMPORT dll */
#endif
const struct format_options *fmtopt; /* v2.07: added */
unsigned hll_label; /* hll directive label counter */
enum dist_type distance; /* stack distance */
enum model_type model; /* memory model */
enum lang_type langtype; /* language */
enum os_type ostype; /* operating system */
enum sformat sub_format; /* sub-output format */
enum fastcall_type fctype; /* fastcall type */
enum seg_order segorder; /* .alpha, .seq, .dosseg */
enum offset_type offsettype; /* OFFSET:GROUP|FLAT|SEGMENT */
short cpu; /* cpu setting (value @cpu symbol); */
enum cpu_info curr_cpu; /* cpu setting (OW stylex); */
unsigned char radix; /* current .RADIX setting */
unsigned char fieldalign; /* -Zp, OPTION:FIELDALIGN setting */
unsigned char line_flags; /* current line has been printed */
#if PROCALIGN
unsigned char procalign; /* current OPTION:PROCALIGN setting */
#endif
enum listmacro list_macro; /* current .LISTMACRO setting */
unsigned char Ofssize; /* current offset size (USE16,USE32,USE64) */
unsigned char defOfssize; /* default segment offset size (16,32 [,64]-bit) */
unsigned char wordsize; /* current word size (2,4,8) */
unsigned char inside_comment; /* v2.10: moved from tokenize.c */
unsigned case_sensitive:1; /* option casemap */
unsigned convert_uppercase:1; /* option casemap */
unsigned procs_private:1; /* option proc:private */
unsigned procs_export:1; /* option proc:export */
unsigned dotname:1; /* option dotname */
unsigned ljmp:1; /* option ljmp */
unsigned m510:1; /* option m510 */
unsigned scoped:1; /* option scoped */
unsigned oldstructs:1; /* option oldstructs */
unsigned emulator:1; /* option emulator */
unsigned setif2:1; /* option setif2 */
unsigned list:1; /* .list/.nolist */
unsigned cref:1; /* .cref/.nocref */
unsigned listif:1; /* .listif/.nolistif */
unsigned list_generated_code:1; /* .listall, -Sa, -Sg */
unsigned StartupDirectiveFound:1;
unsigned EndDirFound:1;
#if AMD64_SUPPORT
unsigned frame_auto:1; /* win64 only */
#endif
unsigned NoSignExtend:1; /* option nosignextend */
#if ELF_SUPPORT || AMD64_SUPPORT || MZ_SUPPORT
union {
#if ELF_SUPPORT || AMD64_SUPPORT
struct {
#if ELF_SUPPORT
uint_8 elf_osabi; /* for ELF */
#endif
#if AMD64_SUPPORT
uint_8 win64_flags; /* for WIN64 + PE(32+) */
#endif
};
#endif
#if MZ_SUPPORT
struct MZDATA mz_data; /* for MZ */
#endif
};
#endif
unsigned char simseg_init; /* simplified segm dir flags */
unsigned char simseg_defd; /* v2.09: flag if seg was defined before simseg dir */
unsigned char PhaseError; /* phase error flag */
unsigned char CommentDataInCode;/* OMF: emit coment records about data in code segs */
unsigned char prologuemode; /* current PEM_ enum value for OPTION PROLOGUE */
unsigned char epiloguemode; /* current PEM_ enum value for OPTION EPILOGUE */
unsigned char invoke_exprparm; /* flag: forward refs for INVOKE params ok? */
#if CVOSUPP
unsigned char cv_opt; /* option codeview */
#endif
unsigned srcfile; /* main source file - is an index for FNames[] */
struct dsym *currseg; /* currently active segment */
struct dsym *flat_grp; /* magic FLAT group */
uint_8 *pCodeBuff;
unsigned int GeneratedCode; /* nesting level generated code */
/* input members */
char *currsource; /* current source line */
char *CurrComment; /* current comment */
struct asm_tok *tokenarray; /* start token buffer */
char *stringbufferend;/* start free space in string buffer */
int token_count; /* number of tokens in curr line */
#if STACKBASESUPP
unsigned basereg[3]; /* stack base register (16-, 32-, 64-bit */
#endif
char name[FILENAME_MAX];/* name of module */
};
#define CurrSource ModuleInfo.currsource
#define Token_Count ModuleInfo.token_count
#define StringBufferEnd ModuleInfo.stringbufferend
#define CurrFile ModuleInfo.g.curr_file
#define CurrFName ModuleInfo.g.curr_fname
#define CurrSeg ModuleInfo.currseg
#define CurrWordSize ModuleInfo.wordsize
struct format_options {
void (*init)( struct module_info * );
short invalid_fixup_type;
const char formatname[6];
};
/* global variables */
extern struct global_options Options;
extern struct module_info ModuleInfo;
extern unsigned int Parse_Pass; /* assembly pass */
//extern unsigned int GeneratedCode; /* v2.10: moved to struct module_info */
extern uint_8 MacroLevel; /* macro nesting level */
extern bool write_to_file; /* 1=write the object module */
/* Information about source, object, listing and error files */
//extern FILE *CurrFile[]; /* ASM, ERR, OBJ and LST */
//extern char *CurrFName[]; /* ASM, ERR, OBJ and LST */
/* functions in assemble.c */
struct fixup;
extern void OutputByte( unsigned char );
//extern void OutputCodeByte( unsigned char );
extern void FillDataBytes( unsigned char, int len );
extern void OutputBytes( const unsigned char *, int len, struct fixup * );
#ifdef __SW_BD
extern int __stdcall AssembleModule( const char * );
#else
extern int AssembleModule( const char * );
#endif
extern void AddLinnumDataRef( unsigned, uint_32 );
extern void SetMasm510( bool );
extern void close_files( void );
extern char *myltoa( uint_32 value, char *buffer, unsigned radix, bool sign, bool addzero );
#if COFF_SUPPORT || PE_SUPPORT
extern char *ConvertSectionName( const struct asym *, enum seg_type *pst, char *buffer );
#endif
#endif