diff --git a/Makefile b/Makefile index 1f10c59..1654a52 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ OS = linux -VERSION = 1.4.2 +VERSION = 1.4.2b DISTFILES = src \ includes \ diff --git a/src/avra.c b/src/avra.c index 5aec61d..e203ba8 100644 --- a/src/avra.c +++ b/src/avra.c @@ -29,6 +29,8 @@ #include #include #include +#include +#include #include "misc.h" #include "args.h" @@ -259,7 +261,7 @@ assemble(struct prog_info *pi) int load_arg_defines(struct prog_info *pi) { - int i; + int64_t i; char *expr; char buff[256]; struct data_list *define; @@ -285,13 +287,13 @@ load_arg_defines(struct prog_info *pi) if (def_const(pi, buff, i)==False) return (False); } else { /* Pass 2 */ - int j; + int64_t j; if (get_constant(pi, buff, &j)==False) { /* Defined in Pass 1 and now missing ? */ fprintf(stderr,"Constant %s is missing in pass 2\n",buff); return (False); } if (i != j) { - fprintf(stderr,"Constant %s changed value from %d in pass1 to %d in pass 2\n",buff,j,i); + fprintf(stderr,"Constant %s changed value from %" PRId64 " in pass1 to %" PRId64 " in pass 2\n",buff,j,i); return (False); } /* OK. Definition is unchanged */ @@ -458,7 +460,7 @@ print_msg(struct prog_info *pi, int type, char *fmt, ...) int -def_const(struct prog_info *pi, const char *name, int value) +def_const(struct prog_info *pi, const char *name, int64_t value) { struct label *label; label = malloc(sizeof(struct label)); @@ -483,7 +485,7 @@ def_const(struct prog_info *pi, const char *name, int value) } int -def_var(struct prog_info *pi, char *name, int value) +def_var(struct prog_info *pi, char *name, int64_t value) { struct label *label; @@ -651,7 +653,7 @@ test_orglist(struct segment_info *si) /* Get the value of a label. Return FALSE if label was not found */ int -get_label(struct prog_info *pi,char *name,int *value) +get_label(struct prog_info *pi,char *name,int64_t *value) { struct label *label=search_symbol(pi,pi->first_label,name,NULL); if (label==NULL) return False; @@ -660,7 +662,7 @@ get_label(struct prog_info *pi,char *name,int *value) } int -get_constant(struct prog_info *pi,char *name,int *value) +get_constant(struct prog_info *pi,char *name,int64_t *value) { struct label *label=search_symbol(pi,pi->first_constant,name,NULL); if (label==NULL) return False; @@ -669,7 +671,7 @@ get_constant(struct prog_info *pi,char *name,int *value) } int -get_variable(struct prog_info *pi,char *name,int *value) +get_variable(struct prog_info *pi,char *name,int64_t *value) { struct label *label=search_symbol(pi,pi->first_variable,name,NULL); if (label==NULL) return False; diff --git a/src/avra.h b/src/avra.h index 363d91f..1b89905 100644 --- a/src/avra.h +++ b/src/avra.h @@ -30,6 +30,7 @@ #include #include +#include #define IS_HOR_SPACE(x) ((x == ' ') || (x == 9)) #define IS_LABEL(x) (isalnum(x) || (x == '%') || (x == '_')) @@ -221,7 +222,7 @@ struct def { struct label { struct label *next; char *name; - int value; + int64_t value; }; struct macro { @@ -286,17 +287,17 @@ void init_segment_size(struct prog_info *pi, struct device *device); void rewind_segments(struct prog_info *pi); void advance_ip(struct segment_info *si, int offset); -int def_const(struct prog_info *pi, const char *name, int value); -int def_var(struct prog_info *pi, char *name, int value); +int def_const(struct prog_info *pi, const char *name, int64_t value); +int def_var(struct prog_info *pi, char *name, int64_t value); int def_orglist(struct segment_info *si); int fix_orglist(struct segment_info *si); void fprint_orglist(FILE *file, struct segment_info *si, struct orglist *orglist); void fprint_sef_orglist(FILE *file, struct segment_info *si); void fprint_segments(FILE *file, struct prog_info *pi); int test_orglist(struct segment_info *si); -int get_label(struct prog_info *pi,char *name,int *value); -int get_constant(struct prog_info *pi,char *name,int *value); -int get_variable(struct prog_info *pi,char *name,int *value); +int get_label(struct prog_info *pi,char *name,int64_t *value); +int get_constant(struct prog_info *pi,char *name,int64_t *value); +int get_variable(struct prog_info *pi,char *name,int64_t *value); struct label *test_label(struct prog_info *pi,char *name,char *message); struct label *test_constant(struct prog_info *pi,char *name,char *message); struct label *test_variable(struct prog_info *pi,char *name,char *message); @@ -321,15 +322,15 @@ char *get_next_token(char *scratch, int term); char *fgets_new(struct prog_info *pi, char *s, int size, FILE *stream); /* expr.c */ -int get_expr(struct prog_info *pi, char *data, int *value); -int get_symbol(struct prog_info *pi, char *label_name, int *data); +int get_expr(struct prog_info *pi, char *data, int64_t *value); +int get_symbol(struct prog_info *pi, char *label_name, int64_t *data); int par_length(char *data); /* mnemonic.c */ int parse_mnemonic(struct prog_info *pi); int get_mnemonic_type(struct prog_info *pi); int get_register(struct prog_info *pi, char *data); -int get_bitnum(struct prog_info *pi, char *data, int *ret); +int get_bitnum(struct prog_info *pi, char *data, int64_t *ret); int get_indirect(struct prog_info *pi, char *operand); int is_supported(struct prog_info *pi, char *name); int count_supported_instructions(int flags); @@ -373,9 +374,9 @@ char *Space(char *n); char *nocase_strcmp(const char *s, const char *t); char *nocase_strncmp(char *s, char *t, int n); char *nocase_strstr(char *s, char *t); -int atox(char *s); -int atoi_n(char *s, int n); -int atox_n(char *s, int n); +int64_t atox(char *s); +int64_t atoi_n(char *s, int n); +int64_t atox_n(char *s, int n); char *my_strlwr(char *in); char *my_strupr(char *in); char *snprint_list(char *buf, size_t limit, const char *const list[]); diff --git a/src/coff.c b/src/coff.c index 657592a..636bc8a 100644 --- a/src/coff.c +++ b/src/coff.c @@ -32,6 +32,7 @@ #include #include +#include #include #include #include @@ -574,7 +575,7 @@ parse_stabs(struct prog_info *pi, char *p) if (*p2 == '0') - TypeCode = atox(p2); /* presume to be hex 0x */ + TypeCode = (int)atox(p2); /* presume to be hex 0x */ else TypeCode = atoi(p2); @@ -706,7 +707,7 @@ int stab_add_lineno(struct prog_info *pi, int LineNumber, char *pLabel, char *pFunction) { - int Address; + int64_t Address; struct lineno *pln; struct syment *pEntry; union auxent *pAux; @@ -754,7 +755,7 @@ int stab_add_lbracket(struct prog_info *pi, int Level, char *pLabel, char *pFunction) { - int Address; + int64_t Address; struct syment *pEntry; union auxent *pAux; @@ -790,7 +791,7 @@ int stab_add_rbracket(struct prog_info *pi, int Level, char *pLabel, char *pFunction) { - int Address; + int64_t Address; struct syment *pEntry; union auxent *pAux; @@ -907,7 +908,8 @@ int stab_add_function(struct prog_info *pi, char *pName, char *pLabel) { - int n, Address; + int n; + int64_t Address; unsigned short CoffType, Type; struct syment *pEntry; char *pType; @@ -991,7 +993,8 @@ int stab_add_global(struct prog_info *pi, char *pName, char *pType) { - int n, Address, IsArray, SymbolIndex; + int n, IsArray, SymbolIndex; + int64_t Address; unsigned short CoffType, Type; struct syment *pEntry; char *p; @@ -1129,7 +1132,8 @@ int stab_add_static_symbol(struct prog_info *pi, char *pName, char *pType, char *pLabel) { - int n, Address; + int n; + int64_t Address; unsigned short CoffType, Type; struct syment *pEntry; diff --git a/src/device.c b/src/device.c index 286d64f..e453bdb 100644 --- a/src/device.c +++ b/src/device.c @@ -28,6 +28,8 @@ #include #include +#include +#include #include "misc.h" #include "avra.h" @@ -206,13 +208,13 @@ predef_dev(struct prog_info *pi) if (def_const(pi, temp, i)==False) return (False); } else { /* Pass 2 */ - int j; + int64_t j; if (get_constant(pi, temp, &j)==False) { /* Defined in Pass 1 and now missing ? */ fprintf(stderr,"Constant %s is missing in pass 2\n",temp); return (False); } if (i != j) { - fprintf(stderr,"Constant %s changed value from %d in pass1 to %d in pass 2\n",temp,j,i); + fprintf(stderr,"Constant %s changed value from %" PRId64 " in pass1 to %d in pass 2\n",temp,j,i); return (False); } /* OK. definition is unchanged */ diff --git a/src/directiv.c b/src/directiv.c index 5627516..9fc0fc3 100644 --- a/src/directiv.c +++ b/src/directiv.c @@ -29,6 +29,8 @@ #include #include #include +#include +#include #include "misc.h" #include "args.h" @@ -157,7 +159,7 @@ parse_directive(struct prog_info *pi) { int directive, pragma; int ok = True; - int i; + int64_t i; char *next, *data, buf[140]; struct file_info *fi_bak; @@ -323,14 +325,14 @@ parse_directive(struct prog_info *pi) if (!get_expr(pi, next, &i)) return (False); if ((i < -32768) || (i > 65535)) - print_msg(pi, MSGTYPE_WARNING, "Value %d is out of range (-32768 <= k <= 65535). Will be masked", i); + print_msg(pi, MSGTYPE_WARNING, "Value %" PRId64 " is out of range (-32768 <= k <= 65535). Will be masked", i); } if (pi->pass == PASS_2) { if (pi->list_line && pi->list_on) { fprintf(pi->list_file, " %s\n", pi->list_line); pi->list_line = NULL; fprintf(pi->list_file, "%c:%06lx %04x\n", - pi->segment->ident, pi->segment->addr, i); + pi->segment->ident, pi->segment->addr, (int)i); } if (pi->segment == pi->eseg) { write_ee_byte(pi, pi->eseg->addr, (unsigned char)i); @@ -375,13 +377,13 @@ parse_directive(struct prog_info *pi) if (def_const(pi, next, i)==False) return (False); } else { /* Pass 2 */ - int j; + int64_t j; if (get_constant(pi, next, &j)==False) { /* Defined in Pass 1 and now missing ? */ print_msg(pi, MSGTYPE_ERROR, "Constant %s is missing in pass 2", next); return (False); } if (i != j) { - print_msg(pi, MSGTYPE_ERROR, "Constant %s changed value from %d in pass1 to %d in pass 2", next,j,i); + print_msg(pi, MSGTYPE_ERROR, "Constant %s changed value from %" PRId64 " in pass1 to %" PRId64 " in pass 2", next,j,i); return (False); } /* OK. Definition is unchanged */ @@ -556,13 +558,13 @@ parse_directive(struct prog_info *pi) if (def_const(pi, next, i)==False) return (False); } else { /* Pass 2 */ - int j; + int64_t j; if (get_constant(pi, next, &j)==False) { /* Defined in Pass 1 and now missing ? */ print_msg(pi, MSGTYPE_ERROR, "Constant %s is missing in pass 2", next); return (False); } if (i != j) { - print_msg(pi, MSGTYPE_ERROR, "Constant %s changed value from %d in pass1 to %d in pass 2", next,j,i); + print_msg(pi, MSGTYPE_ERROR, "Constant %s changed value from %" PRId64 " in pass1 to %" PRId64 " in pass 2", next,j,i); return (False); } /* OK. Definition is unchanged */ @@ -724,7 +726,7 @@ parse_directive(struct prog_info *pi) print_msg(pi, MSGTYPE_APPEND,"\n"); /* Add newline */ return (False); } - print_msg(pi, MSGTYPE_APPEND,"0x%02X",i); + print_msg(pi, MSGTYPE_APPEND,"0x%02" PRIX64,i); } next = data; } @@ -796,7 +798,7 @@ term_string(struct prog_info *pi, char *string) int parse_db(struct prog_info *pi, char *next) { - int i; + int64_t i; int count; char *data; char prev = 0; @@ -831,8 +833,8 @@ parse_db(struct prog_info *pi, char *next) if (!get_expr(pi, next, &i)) return (False); if ((i < -128) || (i > 255)) - print_msg(pi, MSGTYPE_WARNING, "Value %d is out of range (-128 <= k <= 255). Will be masked", i); - if (pi->list_on) fprintf(pi->list_file, "%02X", i); + print_msg(pi, MSGTYPE_WARNING, "Value %" PRId64 " is out of range (-128 <= k <= 255). Will be masked", i); + if (pi->list_on) fprintf(pi->list_file, "%02" PRIX64, i); } count++; write_db(pi, (char)i, &prev, count); @@ -920,7 +922,7 @@ spool_conditional(struct prog_info *pi, int only_endif) int check_conditional(struct prog_info *pi, char *pbuff, int *current_depth, int *do_next, int only_endif) { - int i = 0; + int64_t i = 0; char *next; char linebuff[LINEBUFFER_LENGTH]; diff --git a/src/expr.c b/src/expr.c index 8d8baea..ab7049b 100644 --- a/src/expr.c +++ b/src/expr.c @@ -29,6 +29,7 @@ #include #include #include +#include #include "misc.h" #include "avra.h" @@ -77,7 +78,7 @@ enum { struct element { struct element *next; - int data; + int64_t data; }; char *function_list[] = { @@ -96,10 +97,10 @@ char *function_list[] = { "log2" }; -int -log_2(int value) +int64_t +log_2(int64_t value) { - int i = 0; + int64_t i = 0; while (value >>= 1) i++; return (i); @@ -197,8 +198,8 @@ test_operator_at_precedence(int operator, int precedence) } -int -calc(struct prog_info *pi, int left, int operator, int right) /* TODO: Sjekk litt resultater */ +int64_t +calc(struct prog_info *pi, int64_t left, int operator, int64_t right) /* TODO: Sjekk litt resultater */ { switch (operator) { case OPERATOR_MUL: @@ -220,9 +221,9 @@ calc(struct prog_info *pi, int left, int operator, int right) /* TODO: Sjekk lit case OPERATOR_SUB: return (left - right); case OPERATOR_SHIFT_LEFT: - return (left << right); + return ((uint64_t)left << right); case OPERATOR_SHIFT_RIGHT: - return ((unsigned)left >> right); + return (left >> right); case OPERATOR_LESS_THAN: return (left < right); case OPERATOR_LESS_OR_EQUAL: @@ -271,8 +272,8 @@ get_function(char *function) return (-1); } -unsigned int -do_function(int function, int value) +uint64_t +do_function(int function, uint64_t value) { switch (function) { case FUNCTION_LOW: @@ -302,7 +303,7 @@ do_function(int function, int value) int -get_symbol(struct prog_info *pi, char *label_name, int *data) +get_symbol(struct prog_info *pi, char *label_name, int64_t *data) { struct label *label; struct macro_call *macro_call; @@ -343,7 +344,7 @@ par_length(char *data) } int -get_expr(struct prog_info *pi, char *data, int *value) +get_expr(struct prog_info *pi, char *data, int64_t *value) { /* Definition */ int ok, end, i, count, first_flag, length, function; diff --git a/src/map.c b/src/map.c index c28638d..81915b5 100644 --- a/src/map.c +++ b/src/map.c @@ -27,6 +27,7 @@ #include #include +#include #include "avra.h" #include "args.h" @@ -50,13 +51,13 @@ write_map_file(struct prog_info *pi) return; } for (label = pi->first_constant; label; label = label->next) - fprintf(fp,"%s%sC\t%04x\t%d\n",label->name,Space(label->name),label->value,label->value); + fprintf(fp,"%s%sC\t%04" PRIx64 "\t%" PRId64 "\n",label->name,Space(label->name),label->value,label->value); for (label = pi->first_variable; label; label = label->next) - fprintf(fp,"%s%sV\t%04x\t%d\n",label->name,Space(label->name),label->value,label->value); + fprintf(fp,"%s%sV\t%04" PRIx64 "\t%" PRId64 "\n",label->name,Space(label->name),label->value,label->value); for (label = pi->first_label; label; label = label->next) - fprintf(fp,"%s%sL\t%04x\t%d\n",label->name,Space(label->name),label->value,label->value); + fprintf(fp,"%s%sL\t%04" PRIx64 "\t%" PRId64 "\n",label->name,Space(label->name),label->value,label->value); fprintf(fp,"\n"); fclose(fp); diff --git a/src/mnemonic.c b/src/mnemonic.c index a51871a..a9c5920 100644 --- a/src/mnemonic.c +++ b/src/mnemonic.c @@ -29,6 +29,7 @@ #include #include #include +#include #include "misc.h" #include "avra.h" @@ -346,7 +347,7 @@ int parse_mnemonic(struct prog_info *pi) { int mnemonic; - int i; + int64_t i; int opcode = 0; int opcode2 = 0; int instruction_long = False; @@ -734,10 +735,12 @@ get_register(struct prog_info *pi, char *data) } int -get_bitnum(struct prog_info *pi, char *data, int *ret) +get_bitnum(struct prog_info *pi, char *data, int64_t *ret) { - if (!get_expr(pi, data, ret)) + int64_t i; + if (!get_expr(pi, data, &i)) return (False); + *ret = i; if ((*ret < 0) || (*ret > 7)) { print_msg(pi, MSGTYPE_ERROR, "Operand out of range (0 <= s <= 7)"); return (False); diff --git a/src/stdextra.c b/src/stdextra.c index 968618e..31d660f 100644 --- a/src/stdextra.c +++ b/src/stdextra.c @@ -27,6 +27,7 @@ #include #include +#include #include "misc.h" @@ -79,10 +80,11 @@ nocase_strstr(char *s, char *t) } /* Convert ascii to hex. Ignores "0x". */ -int +int64_t atox(char *s) { - int i = 0, ret = 0; + int i = 0; + int64_t ret = 0; while (s[i] != '\0') { ret <<= 4; @@ -98,10 +100,11 @@ atox(char *s) } /* n ascii chars to int. */ -int +int64_t atoi_n(char *s, int n) { - int i = 0, ret = 0; + int i = 0; + int64_t ret = 0; while ((s[i] != '\0') && n) { ret = 10 * ret + (s[i] - '0'); @@ -112,10 +115,11 @@ atoi_n(char *s, int n) } /* n ascii chars to hex, where 0 < n <= 8. Ignores "0x". */ -int +int64_t atox_n(char *s, int n) { - int i = 0, ret = 0; + int i = 0; + int64_t ret = 0; while ((s[i] != '\0') && n) { ret <<= 4; diff --git a/tests/regression/64bit-expr-values/test.asm b/tests/regression/64bit-expr-values/test.asm new file mode 100644 index 0000000..a56beba --- /dev/null +++ b/tests/regression/64bit-expr-values/test.asm @@ -0,0 +1,47 @@ +.device atmega328p + +; Multiply test (result exceeds 32bit integer range) + +.equ F_CPU = 16000000 + +.if 1000*F_CPU/1000000 != 16000 + .error "1000*F_CPU/1000000 != 16000" +.endif + +; 64bit contant tests + +.equ BIG_CONST = 0x1A2B3C4D5E6F7182 + +.if LOW(BIG_CONST) != 0x82 + .error "LOW(BIG_CONST) != 0x82" +.endif + +.if HIGH(BIG_CONST) != 0x71 + .error "HIGH(BIG_CONST) != 0x71" +.endif + +.if BYTE3(BIG_CONST) != 0x6F + .error "BYTE3(BIG_CONST) != 0x6F" +.endif + +.if BYTE4(BIG_CONST) != 0x5E + .error "BYTE4(BIG_CONST) != 0x5E" +.endif + +.if LOW(BIG_CONST>>32) != 0x4D + .error "LOW(BIG_CONST>>32) != 0x4D" +.endif + +.if HIGH(BIG_CONST>>32) != 0x3C + .error "HIGH(BIG_CONST>>32) != 0x3C" +.endif + +.if BYTE3(BIG_CONST>>32) != 0x2B + .error "BYTE3(BIG_CONST>>32) != 0x2B" +.endif + +.if BYTE4(BIG_CONST>>32) != 0x1A + .error "BYTE4(BIG_CONST>>32) != 0x1A" +.endif + +nop diff --git a/tests/regression/64bit-expr-values/test.hex.expected b/tests/regression/64bit-expr-values/test.hex.expected new file mode 100644 index 0000000..1e97d40 --- /dev/null +++ b/tests/regression/64bit-expr-values/test.hex.expected @@ -0,0 +1,3 @@ +:020000020000FC +:020000000000FE +:00000001FF