finished 2/6 sections for file output
fixed some more minor sm things --HG-- branch : dvander extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/branches/dvander%4018
This commit is contained in:
parent
9cd64d946c
commit
d2cee081ac
@ -34,9 +34,10 @@
|
|||||||
#include <sclinux.h>
|
#include <sclinux.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined HAVE_STDINT_H
|
#if defined __GNUC__
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#else
|
#define HAVE_STDINT_H
|
||||||
|
#elif !defined HAVE_STDINT_H
|
||||||
#if defined __LCC__ || defined __DMC__ || defined LINUX || (defined __WATCOMC__ && __WATCOMC__ >= 1200)
|
#if defined __LCC__ || defined __DMC__ || defined LINUX || (defined __WATCOMC__ && __WATCOMC__ >= 1200)
|
||||||
#if defined HAVE_INTTYPES_H
|
#if defined HAVE_INTTYPES_H
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
@ -459,4 +460,170 @@ int AMXAPI amx_UTF8Put(char *string, char **endptr, int maxchars, cell value);
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
OP_NONE, /* invalid opcode */
|
||||||
|
OP_LOAD_PRI,
|
||||||
|
OP_LOAD_ALT,
|
||||||
|
OP_LOAD_S_PRI,
|
||||||
|
OP_LOAD_S_ALT,
|
||||||
|
OP_LREF_PRI,
|
||||||
|
OP_LREF_ALT,
|
||||||
|
OP_LREF_S_PRI,
|
||||||
|
OP_LREF_S_ALT,
|
||||||
|
OP_LOAD_I,
|
||||||
|
OP_LODB_I,
|
||||||
|
OP_CONST_PRI,
|
||||||
|
OP_CONST_ALT,
|
||||||
|
OP_ADDR_PRI,
|
||||||
|
OP_ADDR_ALT,
|
||||||
|
OP_STOR_PRI,
|
||||||
|
OP_STOR_ALT,
|
||||||
|
OP_STOR_S_PRI,
|
||||||
|
OP_STOR_S_ALT,
|
||||||
|
OP_SREF_PRI,
|
||||||
|
OP_SREF_ALT,
|
||||||
|
OP_SREF_S_PRI,
|
||||||
|
OP_SREF_S_ALT,
|
||||||
|
OP_STOR_I,
|
||||||
|
OP_STRB_I,
|
||||||
|
OP_LIDX,
|
||||||
|
OP_LIDX_B,
|
||||||
|
OP_IDXADDR,
|
||||||
|
OP_IDXADDR_B,
|
||||||
|
OP_ALIGN_PRI,
|
||||||
|
OP_ALIGN_ALT,
|
||||||
|
OP_LCTRL,
|
||||||
|
OP_SCTRL,
|
||||||
|
OP_MOVE_PRI,
|
||||||
|
OP_MOVE_ALT,
|
||||||
|
OP_XCHG,
|
||||||
|
OP_PUSH_PRI,
|
||||||
|
OP_PUSH_ALT,
|
||||||
|
OP_PUSH_R,
|
||||||
|
OP_PUSH_C,
|
||||||
|
OP_PUSH,
|
||||||
|
OP_PUSH_S,
|
||||||
|
OP_POP_PRI,
|
||||||
|
OP_POP_ALT,
|
||||||
|
OP_STACK,
|
||||||
|
OP_HEAP,
|
||||||
|
OP_PROC,
|
||||||
|
OP_RET,
|
||||||
|
OP_RETN,
|
||||||
|
OP_CALL,
|
||||||
|
OP_CALL_PRI,
|
||||||
|
OP_JUMP,
|
||||||
|
OP_JREL,
|
||||||
|
OP_JZER,
|
||||||
|
OP_JNZ,
|
||||||
|
OP_JEQ,
|
||||||
|
OP_JNEQ,
|
||||||
|
OP_JLESS,
|
||||||
|
OP_JLEQ,
|
||||||
|
OP_JGRTR,
|
||||||
|
OP_JGEQ,
|
||||||
|
OP_JSLESS,
|
||||||
|
OP_JSLEQ,
|
||||||
|
OP_JSGRTR,
|
||||||
|
OP_JSGEQ,
|
||||||
|
OP_SHL,
|
||||||
|
OP_SHR,
|
||||||
|
OP_SSHR,
|
||||||
|
OP_SHL_C_PRI,
|
||||||
|
OP_SHL_C_ALT,
|
||||||
|
OP_SHR_C_PRI,
|
||||||
|
OP_SHR_C_ALT,
|
||||||
|
OP_SMUL,
|
||||||
|
OP_SDIV,
|
||||||
|
OP_SDIV_ALT,
|
||||||
|
OP_UMUL,
|
||||||
|
OP_UDIV,
|
||||||
|
OP_UDIV_ALT,
|
||||||
|
OP_ADD,
|
||||||
|
OP_SUB,
|
||||||
|
OP_SUB_ALT,
|
||||||
|
OP_AND,
|
||||||
|
OP_OR,
|
||||||
|
OP_XOR,
|
||||||
|
OP_NOT,
|
||||||
|
OP_NEG,
|
||||||
|
OP_INVERT,
|
||||||
|
OP_ADD_C,
|
||||||
|
OP_SMUL_C,
|
||||||
|
OP_ZERO_PRI,
|
||||||
|
OP_ZERO_ALT,
|
||||||
|
OP_ZERO,
|
||||||
|
OP_ZERO_S,
|
||||||
|
OP_SIGN_PRI,
|
||||||
|
OP_SIGN_ALT,
|
||||||
|
OP_EQ,
|
||||||
|
OP_NEQ,
|
||||||
|
OP_LESS,
|
||||||
|
OP_LEQ,
|
||||||
|
OP_GRTR,
|
||||||
|
OP_GEQ,
|
||||||
|
OP_SLESS,
|
||||||
|
OP_SLEQ,
|
||||||
|
OP_SGRTR,
|
||||||
|
OP_SGEQ,
|
||||||
|
OP_EQ_C_PRI,
|
||||||
|
OP_EQ_C_ALT,
|
||||||
|
OP_INC_PRI,
|
||||||
|
OP_INC_ALT,
|
||||||
|
OP_INC,
|
||||||
|
OP_INC_S,
|
||||||
|
OP_INC_I,
|
||||||
|
OP_DEC_PRI,
|
||||||
|
OP_DEC_ALT,
|
||||||
|
OP_DEC,
|
||||||
|
OP_DEC_S,
|
||||||
|
OP_DEC_I,
|
||||||
|
OP_MOVS,
|
||||||
|
OP_CMPS,
|
||||||
|
OP_FILL,
|
||||||
|
OP_HALT,
|
||||||
|
OP_BOUNDS,
|
||||||
|
OP_SYSREQ_PRI,
|
||||||
|
OP_SYSREQ_C,
|
||||||
|
OP_FILE, /* obsolete */
|
||||||
|
OP_LINE, /* obsolete */
|
||||||
|
OP_SYMBOL, /* obsolete */
|
||||||
|
OP_SRANGE, /* obsolete */
|
||||||
|
OP_JUMP_PRI,
|
||||||
|
OP_SWITCH,
|
||||||
|
OP_CASETBL,
|
||||||
|
OP_SWAP_PRI,
|
||||||
|
OP_SWAP_ALT,
|
||||||
|
OP_PUSH_ADR,
|
||||||
|
OP_NOP,
|
||||||
|
OP_SYSREQ_N,
|
||||||
|
OP_SYMTAG, /* obsolete */
|
||||||
|
OP_BREAK,
|
||||||
|
OP_PUSH2_C,
|
||||||
|
OP_PUSH2,
|
||||||
|
OP_PUSH2_S,
|
||||||
|
OP_PUSH2_ADR,
|
||||||
|
OP_PUSH3_C,
|
||||||
|
OP_PUSH3,
|
||||||
|
OP_PUSH3_S,
|
||||||
|
OP_PUSH3_ADR,
|
||||||
|
OP_PUSH4_C,
|
||||||
|
OP_PUSH4,
|
||||||
|
OP_PUSH4_S,
|
||||||
|
OP_PUSH4_ADR,
|
||||||
|
OP_PUSH5_C,
|
||||||
|
OP_PUSH5,
|
||||||
|
OP_PUSH5_S,
|
||||||
|
OP_PUSH5_ADR,
|
||||||
|
OP_LOAD_BOTH,
|
||||||
|
OP_LOAD_S_BOTH,
|
||||||
|
OP_CONST,
|
||||||
|
OP_CONST_S,
|
||||||
|
/* ----- */
|
||||||
|
OP_SYSREQ_D,
|
||||||
|
OP_SYSREQ_ND,
|
||||||
|
/* ----- */
|
||||||
|
OP_NUM_OPCODES
|
||||||
|
} OPCODE;
|
||||||
|
|
||||||
#endif /* AMX_H_INCLUDED */
|
#endif /* AMX_H_INCLUDED */
|
||||||
|
@ -221,6 +221,8 @@ char *pc_readasm(void *handle, char *string, int maxchars)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern memfile_t *bin_file;
|
||||||
|
|
||||||
/* Should return a pointer, which is used as a "magic cookie" to all I/O
|
/* Should return a pointer, which is used as a "magic cookie" to all I/O
|
||||||
* functions; return NULL for failure.
|
* functions; return NULL for failure.
|
||||||
*/
|
*/
|
||||||
@ -234,6 +236,9 @@ void pc_closebin(void *handle,int deletefile)
|
|||||||
if (deletefile)
|
if (deletefile)
|
||||||
{
|
{
|
||||||
memfile_destroy((memfile_t *)handle);
|
memfile_destroy((memfile_t *)handle);
|
||||||
|
bin_file = NULL;
|
||||||
|
} else {
|
||||||
|
bin_file = (memfile_t *)handle;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,6 +42,7 @@
|
|||||||
# define access _access
|
# define access _access
|
||||||
# define chdir _chdir
|
# define chdir _chdir
|
||||||
# define strdup _strdup
|
# define strdup _strdup
|
||||||
|
# define unlink _unlink
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1,30 +1,389 @@
|
|||||||
/* Pawn compiler driver
|
#include <stdio.h>
|
||||||
*
|
#include <setjmp.h>
|
||||||
* Function and variable definition and declaration, statement parser.
|
#include <assert.h>
|
||||||
*
|
#include <string.h>
|
||||||
* Copyright (c) ITB CompuPhase, 2006
|
#include "memfile.h"
|
||||||
*
|
#include "sp_file.h"
|
||||||
* This software is provided "as-is", without any express or implied warranty.
|
#include "amx.h"
|
||||||
* In no event will the authors be held liable for any damages arising from
|
#include "osdefs.h"
|
||||||
* the use of this software.
|
|
||||||
*
|
#define NUM_SECTIONS 6
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
int pc_printf(const char *message,...);
|
||||||
* freely, subject to the following restrictions:
|
int pc_compile(int argc, char **argv);
|
||||||
*
|
void sfwrite(const void *buf, size_t size, size_t count, FILE *fp);
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software in
|
memfile_t *bin_file = NULL;
|
||||||
* a product, an acknowledgment in the product documentation would be
|
jmp_buf brkout;
|
||||||
* appreciated but is not required.
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
* 3. This notice may not be removed or altered from any source distribution.
|
|
||||||
*
|
|
||||||
* Version: $Id: Sc1.c 3114 2005-03-17 14:48:29Z thiadmer $
|
|
||||||
*/
|
|
||||||
#include "sc.h"
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
return pc_compile(argc,argv);
|
if (pc_compile(argc,argv) == 0)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
AMX_HEADER *hdr;
|
||||||
|
sp_file_hdr_t shdr;
|
||||||
|
uint32_t curoffs = 0;
|
||||||
|
uint32_t lastsection = 0;
|
||||||
|
int err;
|
||||||
|
uint8_t i8;
|
||||||
|
uint32_t i;
|
||||||
|
const char *tables[NUM_SECTIONS] = {".code", ".data", ".publics", ".pubvars", ".natives", ".names"};
|
||||||
|
uint32_t offsets[NUM_SECTIONS] = {0,0,0,0,0,0};
|
||||||
|
sp_file_section_t sh;
|
||||||
|
|
||||||
|
if (bin_file == NULL)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
hdr = (AMX_HEADER *)bin_file->base;
|
||||||
|
shdr.version = SPFILE_VERSION;
|
||||||
|
shdr.magic = SPFILE_MAGIC;
|
||||||
|
|
||||||
|
if ((fp=fopen(bin_file->name, "wb")) == NULL)
|
||||||
|
{
|
||||||
|
pc_printf("Error writing to file: %s", bin_file->name);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((err=setjmp(brkout))!=0)
|
||||||
|
{
|
||||||
|
goto write_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
shdr.sections = NUM_SECTIONS;
|
||||||
|
shdr.stringtab = sizeof(shdr) + (sizeof(sp_file_section_t) * shdr.sections);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* write the header
|
||||||
|
* unwritten values:
|
||||||
|
* imagesize
|
||||||
|
*/
|
||||||
|
sfwrite(&shdr, sizeof(shdr), 1, fp);
|
||||||
|
|
||||||
|
curoffs = shdr.stringtab;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* write the sections
|
||||||
|
* unwritten values:
|
||||||
|
* dataoffs
|
||||||
|
* size
|
||||||
|
*/
|
||||||
|
for (i8=0; i8<shdr.sections; i8++)
|
||||||
|
{
|
||||||
|
/* set name offset to next in string table */
|
||||||
|
sh.nameoffs = curoffs - shdr.stringtab;
|
||||||
|
/* save offset to this section */
|
||||||
|
offsets[i8] = (uint32_t)ftell(fp) + sizeof(sh.nameoffs);
|
||||||
|
/* update `end of file` offset */
|
||||||
|
curoffs += strlen(tables[i8]) + 1;
|
||||||
|
sfwrite(&sh, sizeof(sh), 1, fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** write the string table */
|
||||||
|
for (i8=0; i8<shdr.sections; i8++)
|
||||||
|
{
|
||||||
|
sfwrite(tables[i8], 1, strlen(tables[i8])+1, fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
lastsection = curoffs;
|
||||||
|
|
||||||
|
/** write the code table */
|
||||||
|
if (strcmp(tables[0], ".code") == 0)
|
||||||
|
{
|
||||||
|
sp_file_code_t cod;
|
||||||
|
cell cip;
|
||||||
|
unsigned char *cbase;
|
||||||
|
uint8_t *tbase, *tptr;
|
||||||
|
cell real_codesize;
|
||||||
|
uint8_t op;
|
||||||
|
|
||||||
|
cod.cellsize = sizeof(cell);
|
||||||
|
|
||||||
|
cod.codesize = 0;
|
||||||
|
cod.codeversion = hdr->amx_version;
|
||||||
|
cod.flags = 0;
|
||||||
|
if (hdr->flags & AMX_FLAG_DEBUG)
|
||||||
|
{
|
||||||
|
cod.flags |= SP_FILE_DEBUG;
|
||||||
|
}
|
||||||
|
cod.code = sizeof(cod);
|
||||||
|
|
||||||
|
/* write the code in our newer format */
|
||||||
|
cbase = (unsigned char *)hdr + hdr->cod;
|
||||||
|
real_codesize = hdr->dat - hdr->cod;
|
||||||
|
tbase = (uint8_t *)malloc(real_codesize);
|
||||||
|
tptr = tbase;
|
||||||
|
for (cip = 0; cip < real_codesize;)
|
||||||
|
{
|
||||||
|
#define DBGPARAM(v) ( (v)=*(cell *)(cbase+(int)cip), cip+=sizeof(cell) )
|
||||||
|
op=(uint8_t) *(ucell *)(cbase+(int)cip);
|
||||||
|
cip += sizeof(cell);
|
||||||
|
*tptr++ = op;
|
||||||
|
switch (op)
|
||||||
|
{
|
||||||
|
case OP_PUSH5_C: /* instructions with 5 parameters */
|
||||||
|
case OP_PUSH5:
|
||||||
|
case OP_PUSH5_S:
|
||||||
|
case OP_PUSH5_ADR:
|
||||||
|
{
|
||||||
|
memcpy(tptr, cbase+(int)cip, sizeof(cell)*5);
|
||||||
|
cip += sizeof(cell)*5;
|
||||||
|
tptr += sizeof(cell)*5;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case OP_PUSH4_C: /* instructions with 4 parameters */
|
||||||
|
case OP_PUSH4:
|
||||||
|
case OP_PUSH4_S:
|
||||||
|
case OP_PUSH4_ADR:
|
||||||
|
{
|
||||||
|
memcpy(tptr, cbase+(int)cip, sizeof(cell)*4);
|
||||||
|
cip += sizeof(cell)*4;
|
||||||
|
tptr += sizeof(cell)*4;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case OP_PUSH3_C: /* instructions with 3 parameters */
|
||||||
|
case OP_PUSH3:
|
||||||
|
case OP_PUSH3_S:
|
||||||
|
case OP_PUSH3_ADR:
|
||||||
|
{
|
||||||
|
memcpy(tptr, cbase+(int)cip, sizeof(cell)*3);
|
||||||
|
cip += sizeof(cell)*3;
|
||||||
|
tptr += sizeof(cell)*3;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case OP_PUSH2_C: /* instructions with 2 parameters */
|
||||||
|
case OP_PUSH2:
|
||||||
|
case OP_PUSH2_S:
|
||||||
|
case OP_PUSH2_ADR:
|
||||||
|
case OP_LOAD_BOTH:
|
||||||
|
case OP_LOAD_S_BOTH:
|
||||||
|
case OP_CONST:
|
||||||
|
case OP_CONST_S:
|
||||||
|
case OP_SYSREQ_N:
|
||||||
|
{
|
||||||
|
memcpy(tptr, cbase+(int)cip, sizeof(cell)*2);
|
||||||
|
cip += sizeof(cell)*2;
|
||||||
|
tptr += sizeof(cell)*2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case OP_LOAD_PRI: /* instructions with 1 parameter */
|
||||||
|
case OP_LOAD_ALT:
|
||||||
|
case OP_LOAD_S_PRI:
|
||||||
|
case OP_LOAD_S_ALT:
|
||||||
|
case OP_LREF_PRI:
|
||||||
|
case OP_LREF_ALT:
|
||||||
|
case OP_LREF_S_PRI:
|
||||||
|
case OP_LREF_S_ALT:
|
||||||
|
case OP_LODB_I:
|
||||||
|
case OP_CONST_PRI:
|
||||||
|
case OP_CONST_ALT:
|
||||||
|
case OP_ADDR_PRI:
|
||||||
|
case OP_ADDR_ALT:
|
||||||
|
case OP_STOR_PRI:
|
||||||
|
case OP_STOR_ALT:
|
||||||
|
case OP_STOR_S_PRI:
|
||||||
|
case OP_STOR_S_ALT:
|
||||||
|
case OP_SREF_PRI:
|
||||||
|
case OP_SREF_ALT:
|
||||||
|
case OP_SREF_S_PRI:
|
||||||
|
case OP_SREF_S_ALT:
|
||||||
|
case OP_STRB_I:
|
||||||
|
case OP_LIDX_B:
|
||||||
|
case OP_IDXADDR_B:
|
||||||
|
case OP_ALIGN_PRI:
|
||||||
|
case OP_ALIGN_ALT:
|
||||||
|
case OP_LCTRL:
|
||||||
|
case OP_SCTRL:
|
||||||
|
case OP_PUSH_R:
|
||||||
|
case OP_PUSH_C:
|
||||||
|
case OP_PUSH:
|
||||||
|
case OP_PUSH_S:
|
||||||
|
case OP_STACK:
|
||||||
|
case OP_HEAP:
|
||||||
|
case OP_JREL:
|
||||||
|
case OP_SHL_C_PRI:
|
||||||
|
case OP_SHL_C_ALT:
|
||||||
|
case OP_SHR_C_PRI:
|
||||||
|
case OP_SHR_C_ALT:
|
||||||
|
case OP_ADD_C:
|
||||||
|
case OP_SMUL_C:
|
||||||
|
case OP_ZERO:
|
||||||
|
case OP_ZERO_S:
|
||||||
|
case OP_EQ_C_PRI:
|
||||||
|
case OP_EQ_C_ALT:
|
||||||
|
case OP_INC:
|
||||||
|
case OP_INC_S:
|
||||||
|
case OP_DEC:
|
||||||
|
case OP_DEC_S:
|
||||||
|
case OP_MOVS:
|
||||||
|
case OP_CMPS:
|
||||||
|
case OP_FILL:
|
||||||
|
case OP_HALT:
|
||||||
|
case OP_BOUNDS:
|
||||||
|
case OP_PUSH_ADR:
|
||||||
|
case OP_CALL: /* opcodes that need relocation */
|
||||||
|
case OP_JUMP:
|
||||||
|
case OP_JZER:
|
||||||
|
case OP_JNZ:
|
||||||
|
case OP_JEQ:
|
||||||
|
case OP_JNEQ:
|
||||||
|
case OP_JLESS:
|
||||||
|
case OP_JLEQ:
|
||||||
|
case OP_JGRTR:
|
||||||
|
case OP_JGEQ:
|
||||||
|
case OP_JSLESS:
|
||||||
|
case OP_JSLEQ:
|
||||||
|
case OP_JSGRTR:
|
||||||
|
case OP_JSGEQ:
|
||||||
|
case OP_SWITCH:
|
||||||
|
case OP_SYSREQ_C:
|
||||||
|
{
|
||||||
|
*(cell *)tptr = *(cell *)(cbase + (int)cip);
|
||||||
|
cip += sizeof(cell);
|
||||||
|
tptr += sizeof(cell);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case OP_LOAD_I: /* instructions without parameters */
|
||||||
|
case OP_STOR_I:
|
||||||
|
case OP_LIDX:
|
||||||
|
case OP_IDXADDR:
|
||||||
|
case OP_MOVE_PRI:
|
||||||
|
case OP_MOVE_ALT:
|
||||||
|
case OP_XCHG:
|
||||||
|
case OP_PUSH_PRI:
|
||||||
|
case OP_PUSH_ALT:
|
||||||
|
case OP_POP_PRI:
|
||||||
|
case OP_POP_ALT:
|
||||||
|
case OP_PROC:
|
||||||
|
case OP_RET:
|
||||||
|
case OP_RETN:
|
||||||
|
case OP_CALL_PRI:
|
||||||
|
case OP_SHL:
|
||||||
|
case OP_SHR:
|
||||||
|
case OP_SSHR:
|
||||||
|
case OP_SMUL:
|
||||||
|
case OP_SDIV:
|
||||||
|
case OP_SDIV_ALT:
|
||||||
|
case OP_UMUL:
|
||||||
|
case OP_UDIV:
|
||||||
|
case OP_UDIV_ALT:
|
||||||
|
case OP_ADD:
|
||||||
|
case OP_SUB:
|
||||||
|
case OP_SUB_ALT:
|
||||||
|
case OP_AND:
|
||||||
|
case OP_OR:
|
||||||
|
case OP_XOR:
|
||||||
|
case OP_NOT:
|
||||||
|
case OP_NEG:
|
||||||
|
case OP_INVERT:
|
||||||
|
case OP_ZERO_PRI:
|
||||||
|
case OP_ZERO_ALT:
|
||||||
|
case OP_SIGN_PRI:
|
||||||
|
case OP_SIGN_ALT:
|
||||||
|
case OP_EQ:
|
||||||
|
case OP_NEQ:
|
||||||
|
case OP_LESS:
|
||||||
|
case OP_LEQ:
|
||||||
|
case OP_GRTR:
|
||||||
|
case OP_GEQ:
|
||||||
|
case OP_SLESS:
|
||||||
|
case OP_SLEQ:
|
||||||
|
case OP_SGRTR:
|
||||||
|
case OP_SGEQ:
|
||||||
|
case OP_INC_PRI:
|
||||||
|
case OP_INC_ALT:
|
||||||
|
case OP_INC_I:
|
||||||
|
case OP_DEC_PRI:
|
||||||
|
case OP_DEC_ALT:
|
||||||
|
case OP_DEC_I:
|
||||||
|
case OP_SYSREQ_PRI:
|
||||||
|
case OP_JUMP_PRI:
|
||||||
|
case OP_SWAP_PRI:
|
||||||
|
case OP_SWAP_ALT:
|
||||||
|
case OP_NOP:
|
||||||
|
case OP_BREAK:
|
||||||
|
break;
|
||||||
|
case OP_CASETBL:
|
||||||
|
{
|
||||||
|
cell num;
|
||||||
|
int i;
|
||||||
|
DBGPARAM(*(cell *)tptr);
|
||||||
|
num = *(cell *)tptr;
|
||||||
|
tptr += sizeof(cell);
|
||||||
|
memcpy(tptr, cbase+(int)cip, (2*num+1)*sizeof(cell));
|
||||||
|
tptr += (2*num+1) * sizeof(cell);
|
||||||
|
cip += (2*num+1) * sizeof(cell);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
#undef DBGPARAM
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cod.codesize = (uint32_t)(tptr - tbase);
|
||||||
|
sfwrite(&cod, sizeof(cod), 1, fp);
|
||||||
|
sfwrite(tbase, cod.codesize, 1, fp);
|
||||||
|
free(tbase);
|
||||||
|
|
||||||
|
/* backtrack and write this section's header info */
|
||||||
|
curoffs = (uint32_t)ftell(fp);
|
||||||
|
fseek(fp, offsets[0], SEEK_SET);
|
||||||
|
sfwrite(&lastsection, sizeof(lastsection), 1, fp);
|
||||||
|
cod.codesize += sizeof(cod);
|
||||||
|
sfwrite(&cod.codesize, sizeof(cod.codesize), 1, fp);
|
||||||
|
fseek(fp, curoffs, SEEK_SET);
|
||||||
|
lastsection = curoffs;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(tables[1], ".data") == 0)
|
||||||
|
{
|
||||||
|
sp_file_data_t dat;
|
||||||
|
unsigned char *dbase;
|
||||||
|
|
||||||
|
dat.datasize = hdr->hea - hdr->dat;
|
||||||
|
dat.memsize = hdr->stp;
|
||||||
|
dat.data = sizeof(dat);
|
||||||
|
dbase = (unsigned char *)hdr + hdr->dat;
|
||||||
|
|
||||||
|
sfwrite(&dat, sizeof(dat), 1, fp);
|
||||||
|
if (dat.datasize)
|
||||||
|
{
|
||||||
|
sfwrite(dbase, dat.datasize, 1, fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* backtrack and write this section's header info */
|
||||||
|
curoffs = ftell(fp);
|
||||||
|
fseek(fp, offsets[1], SEEK_SET);
|
||||||
|
sfwrite(&lastsection, sizeof(lastsection), 1, fp);
|
||||||
|
dat.datasize += sizeof(dat);
|
||||||
|
sfwrite(&dat.datasize, sizeof(dat.datasize),1, fp);
|
||||||
|
fseek(fp, curoffs, SEEK_SET);
|
||||||
|
lastsection = curoffs;
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
write_error:
|
||||||
|
pc_printf("Error writing to file: %s", bin_file->name);
|
||||||
|
unlink(bin_file->name);
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sfwrite(const void *buf, size_t size, size_t count, FILE *fp)
|
||||||
|
{
|
||||||
|
if (fwrite(buf, size, count, fp) != count)
|
||||||
|
{
|
||||||
|
longjmp(brkout, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -629,14 +629,10 @@ static void initglobals(void)
|
|||||||
warnnum=0; /* number of warnings */
|
warnnum=0; /* number of warnings */
|
||||||
optproccall=FALSE; /* sourcemod: do not support "procedure call" */
|
optproccall=FALSE; /* sourcemod: do not support "procedure call" */
|
||||||
verbosity=1; /* verbosity level, no copyright banner */
|
verbosity=1; /* verbosity level, no copyright banner */
|
||||||
sc_debug=sSYMBOLIC; /* sourcemod: full debug stuff */
|
sc_debug=sCHKBOUNDS|sSYMBOLIC; /* sourcemod: full debug stuff */
|
||||||
pc_optimize=sOPTIMIZE_DEFAULT; /* sourcemod: full optimization */
|
pc_optimize=sOPTIMIZE_DEFAULT; /* sourcemod: full optimization */
|
||||||
sc_packstr=FALSE; /* strings are unpacked by default */
|
sc_packstr=FALSE; /* strings are unpacked by default */
|
||||||
#if AMX_COMPACTMARGIN > 2
|
sc_compress=FALSE; /* always disable compact encoding! */
|
||||||
sc_compress=TRUE; /* compress output bytecodes */
|
|
||||||
#else
|
|
||||||
sc_compress=FALSE;
|
|
||||||
#endif
|
|
||||||
sc_needsemicolon=FALSE;/* semicolon required to terminate expressions? */
|
sc_needsemicolon=FALSE;/* semicolon required to terminate expressions? */
|
||||||
sc_dataalign=sizeof(cell);
|
sc_dataalign=sizeof(cell);
|
||||||
pc_stksize=sDEF_AMXSTACK;/* default stack size */
|
pc_stksize=sDEF_AMXSTACK;/* default stack size */
|
||||||
@ -1132,7 +1128,7 @@ static void about(void)
|
|||||||
pc_printf("Options:\n");
|
pc_printf("Options:\n");
|
||||||
pc_printf(" -A<num> alignment in bytes of the data segment and the stack\n");
|
pc_printf(" -A<num> alignment in bytes of the data segment and the stack\n");
|
||||||
pc_printf(" -a output assembler code\n");
|
pc_printf(" -a output assembler code\n");
|
||||||
#if AMX_COMPACTMARGIN > 2
|
#if 0 /* not toggleable in SourceMod */
|
||||||
pc_printf(" -C[+/-] compact encoding for output file (default=%c)\n", sc_compress ? '+' : '-');
|
pc_printf(" -C[+/-] compact encoding for output file (default=%c)\n", sc_compress ? '+' : '-');
|
||||||
#endif
|
#endif
|
||||||
pc_printf(" -c<name> codepage name or number; e.g. 1252 for Windows Latin-1\n");
|
pc_printf(" -c<name> codepage name or number; e.g. 1252 for Windows Latin-1\n");
|
||||||
|
@ -1076,10 +1076,12 @@ static int command(void)
|
|||||||
if (find_constval(&libname_tab,name,0)==NULL)
|
if (find_constval(&libname_tab,name,0)==NULL)
|
||||||
curlibrary=append_constval(&libname_tab,name,0,0);
|
curlibrary=append_constval(&libname_tab,name,0,0);
|
||||||
} /* if */
|
} /* if */
|
||||||
|
#if 0 /* more unused */
|
||||||
} else if (strcmp(str,"pack")==0) {
|
} else if (strcmp(str,"pack")==0) {
|
||||||
cell val;
|
cell val;
|
||||||
preproc_expr(&val,NULL); /* default = packed/unpacked */
|
preproc_expr(&val,NULL); /* default = packed/unpacked */
|
||||||
sc_packstr=(int)val;
|
sc_packstr=(int)val;
|
||||||
|
#endif
|
||||||
} else if (strcmp(str,"rational")==0) {
|
} else if (strcmp(str,"rational")==0) {
|
||||||
char name[sNAMEMAX+1];
|
char name[sNAMEMAX+1];
|
||||||
cell digits=0;
|
cell digits=0;
|
||||||
|
@ -47,7 +47,7 @@ typedef struct {
|
|||||||
char *name;
|
char *name;
|
||||||
int segment; /* sIN_CSEG=parse in cseg, sIN_DSEG=parse in dseg */
|
int segment; /* sIN_CSEG=parse in cseg, sIN_DSEG=parse in dseg */
|
||||||
OPCODE_PROC func;
|
OPCODE_PROC func;
|
||||||
} OPCODE;
|
} OPCODEC;
|
||||||
|
|
||||||
static cell codeindex; /* similar to "code_idx" */
|
static cell codeindex; /* similar to "code_idx" */
|
||||||
static cell *lbltab; /* label table */
|
static cell *lbltab; /* label table */
|
||||||
@ -454,7 +454,7 @@ static cell do_case(FILE *fbin,char *params,cell opcode)
|
|||||||
return opcodes(0)+opargs(2);
|
return opcodes(0)+opargs(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static OPCODE opcodelist[] = {
|
static OPCODEC opcodelist[] = {
|
||||||
/* node for "invalid instruction" */
|
/* node for "invalid instruction" */
|
||||||
{ 0, NULL, 0, noop },
|
{ 0, NULL, 0, noop },
|
||||||
/* opcodes in sorted order */
|
/* opcodes in sorted order */
|
||||||
|
102
compiler-init/sp_file.h
Normal file
102
compiler-init/sp_file.h
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
#ifndef _INCLUDE_SPFILE_H
|
||||||
|
#define _INCLUDE_SPFILE_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#if defined __GNUC__ || defined HAVE_STDINT_
|
||||||
|
#include <stdint.h>
|
||||||
|
#else
|
||||||
|
#if !defined HAVE_STDINT_H
|
||||||
|
typedef unsigned __int64 uint64_t;
|
||||||
|
typedef __int64 int64_t;
|
||||||
|
typedef unsigned __int32 uint32_t;
|
||||||
|
typedef __int32 int32_t;
|
||||||
|
typedef unsigned __int16 uint16_t;
|
||||||
|
typedef __int16 int16_t;
|
||||||
|
typedef unsigned __int8 uint8_t;
|
||||||
|
typedef __int8 int8_t;
|
||||||
|
#define HAVE_STDINT_H
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SPFILE_MAGIC 0xDEADC0D3
|
||||||
|
#define SPFILE_VERSION 0x0100
|
||||||
|
|
||||||
|
//:TODO: better compiler/nix support
|
||||||
|
#if defined __linux__
|
||||||
|
#pragma pack(1) /* structures must be packed (byte-aligned) */
|
||||||
|
#else
|
||||||
|
#pragma pack(push)
|
||||||
|
#pragma pack(1) /* structures must be packed (byte-aligned) */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct sp_file_section_s
|
||||||
|
{
|
||||||
|
uint32_t nameoffs; /* rel offset into global string table */
|
||||||
|
uint32_t dataoffs;
|
||||||
|
uint32_t size;
|
||||||
|
} sp_file_section_t;
|
||||||
|
|
||||||
|
typedef struct sp_file_hdr_s
|
||||||
|
{
|
||||||
|
uint32_t magic;
|
||||||
|
uint16_t version;
|
||||||
|
uint32_t imagesize;
|
||||||
|
uint8_t sections;
|
||||||
|
uint32_t stringtab;
|
||||||
|
} sp_file_hdr_t;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
SP_FILE_NONE = 0,
|
||||||
|
SP_FILE_DEBUG = 1,
|
||||||
|
} sp_file_flags_t;
|
||||||
|
|
||||||
|
/* section is ".code" */
|
||||||
|
typedef struct sp_file_code_s
|
||||||
|
{
|
||||||
|
uint32_t codesize; /* codesize in bytes */
|
||||||
|
uint8_t cellsize; /* cellsize in bytes */
|
||||||
|
uint8_t codeversion; /* version of opcodes supported */
|
||||||
|
uint16_t flags; /* flags */
|
||||||
|
uint32_t code; /* rel offset to code */
|
||||||
|
} sp_file_code_t;
|
||||||
|
|
||||||
|
/* section is .data */
|
||||||
|
typedef struct sp_file_data_s
|
||||||
|
{
|
||||||
|
uint32_t datasize; /* size of data section */
|
||||||
|
uint32_t memsize; /* total mem required (includes data) */
|
||||||
|
uint32_t data; /* file offset to data (helper) */
|
||||||
|
} sp_file_data_t;
|
||||||
|
|
||||||
|
/* section is .publics */
|
||||||
|
typedef struct sp_file_publics_s
|
||||||
|
{
|
||||||
|
uint32_t address; /* address rel to code section */
|
||||||
|
uint32_t name; /* index into nametable */
|
||||||
|
} sp_file_publics_t;
|
||||||
|
|
||||||
|
/* section is .natives */
|
||||||
|
typedef struct sp_file_natives_s
|
||||||
|
{
|
||||||
|
uint32_t name; /* name of native at index */
|
||||||
|
} sp_file_natives_t;
|
||||||
|
|
||||||
|
/* section is .pubvars */
|
||||||
|
typedef struct sp_file_pubvars_s
|
||||||
|
{
|
||||||
|
uint32_t address; /* address rel to dat section */
|
||||||
|
uint32_t name; /* index into nametable */
|
||||||
|
} sp_file_pubvars_t;
|
||||||
|
|
||||||
|
#if defined __linux__
|
||||||
|
#pragma pack() /* reset default packing */
|
||||||
|
#else
|
||||||
|
#pragma pack(pop) /* reset previous packing */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* section is .names */
|
||||||
|
typedef char * sp_file_nametab_t;
|
||||||
|
|
||||||
|
#endif //_INCLUDE_SPFILE_H
|
@ -250,6 +250,10 @@
|
|||||||
RelativePath=".\scvars.c"
|
RelativePath=".\scvars.c"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\sp_file.c"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
Name="Header Files"
|
Name="Header Files"
|
||||||
@ -276,6 +280,10 @@
|
|||||||
RelativePath=".\sc.h"
|
RelativePath=".\sc.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\sp_file.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\svnrev.h"
|
RelativePath=".\svnrev.h"
|
||||||
>
|
>
|
||||||
|
Loading…
Reference in New Issue
Block a user