i swear to god one day ill remember to include the patches in the first post
From: =?utf-8?b?0L3QsNCx?= <nabijaczlew...@nabijaczleweli.xyz>
Date: Tue, 25 Jul 2023 21:20:32 +0200
Subject: Add llong/ullong. Tested on i686/amd64

---
 expr.c                         |  6 +++---
 expr.h                         |  4 ++--
 lens_default.c                 | 14 ++++++++++----
 printf.c                       | 10 +++++-----
 read_config_file.c             |  4 ++++
 sysdeps/linux-gnu/ia64/fetch.c |  4 ++++
 sysdeps/linux-gnu/m68k/fetch.c |  2 ++
 sysdeps/linux-gnu/ppc/fetch.c  |  2 ++
 sysdeps/linux-gnu/ppc/trace.c  |  6 ++++++
 sysdeps/linux-gnu/s390/fetch.c |  2 ++
 sysdeps/linux-gnu/s390/trace.c |  6 ++++++
 sysdeps/linux-gnu/x86/fetch.c  | 15 ++++++++++++---
 sysdeps/linux-gnu/x86/trace.c  |  6 ++++++
 type.c                         | 25 ++++++++++++++++++++++---
 type.h                         |  2 ++
 value.c                        | 16 ++++++++--------
 value.h                        |  4 ++--
 zero.c                         |  2 +-
 18 files changed, 99 insertions(+), 31 deletions(-)

diff --git a/expr.c b/expr.c
index 32860fd..01ce4c6 100644
--- a/expr.c
+++ b/expr.c
@@ -246,7 +246,7 @@ eval_index(struct expr_node *node, struct value *context,
 	if (expr_eval(node->lhs, context, arguments, &lhs) < 0)
 		return -1;
 
-	long l;
+	long long l;
 	if (expr_eval_word(node->u.node.n, context, arguments, &l) < 0) {
 	fail:
 		value_destroy(&lhs);
@@ -305,7 +305,7 @@ expr_eval(struct expr_node *node, struct value *context,
 
 int
 expr_eval_word(struct expr_node *node, struct value *context,
-	       struct value_dict *arguments, long *ret_value)
+	       struct value_dict *arguments, long long *ret_value)
 {
 	struct value val;
 	if (expr_eval(node, context, arguments, &val) < 0)
@@ -318,7 +318,7 @@ expr_eval_word(struct expr_node *node, struct value *context,
 }
 
 int
-expr_eval_constant(struct expr_node *node, long *valuep)
+expr_eval_constant(struct expr_node *node, long long *valuep)
 {
 	assert(expr_is_compile_constant(node));
 	return expr_eval_word(node, NULL, NULL, valuep);
diff --git a/expr.h b/expr.h
index 53b75b7..aa4b0b6 100644
--- a/expr.h
+++ b/expr.h
@@ -135,7 +135,7 @@ int expr_eval(struct expr_node *node, struct value *context,
 
 /* Evaluate compile-time expression.  Returns 0 on success or negative
  * value on failure.  Computed value is passed back in *VALUEP.  */
-int expr_eval_constant(struct expr_node *node, long *valuep);
+int expr_eval_constant(struct expr_node *node, long long *valuep);
 
 /* Evaluate expression, whose result should fit into a word.  In order
  * to easily support all the structure and array accesses, we simply
@@ -143,7 +143,7 @@ int expr_eval_constant(struct expr_node *node, long *valuep);
  * to be able to get out a word-size datum to use it as an index, a
  * length, etc.  */
 int expr_eval_word(struct expr_node *node, struct value *context,
-		   struct value_dict *arguments, long *ret_value);
+		   struct value_dict *arguments, long long *ret_value);
 
 /* Returns non-zero value if the expression is a compile-time
  * constant.  Currently this is only EXPR_OP_CONST, but eventually
diff --git a/lens_default.c b/lens_default.c
index 36531c2..2fd4915 100644
--- a/lens_default.c
+++ b/lens_default.c
@@ -58,7 +58,7 @@ READER(read_double, double)
 
 #define HANDLE_WIDTH(BITS)						\
 	do {								\
-		long l;							\
+		long long l;							\
 		if (value_extract_word(value, &l, arguments) < 0)	\
 			return -1;					\
 		int##BITS##_t i = l;					\
@@ -124,7 +124,7 @@ acc_fprintf(int *countp, FILE *stream, const char *format, ...)
 static int
 format_char(FILE *stream, struct value *value, struct value_dict *arguments)
 {
-	long lc;
+	long long lc;
 	if (value_extract_word(value, &lc, arguments) < 0)
 		return -1;
 	int c = (int)lc;
@@ -344,8 +344,8 @@ format_array(FILE *stream, struct value *value, struct value_dict *arguments,
 {
 	/* We need "long" to be long enough to cover the whole address
 	 * space.  */
-	(void)sizeof(char[1 - 2*(sizeof(long) < sizeof(void *))]);
-	long l;
+	(void)sizeof(char[1 - 2*(sizeof(long long) < sizeof(void *))]);
+	long long l;
 	if (expr_eval_word(length, value, arguments, &l) < 0)
 		return -1;
 	size_t len = (size_t)l;
@@ -394,11 +394,13 @@ toplevel_format_lens(struct lens *lens, FILE *stream,
 	case ARGTYPE_SHORT:
 	case ARGTYPE_INT:
 	case ARGTYPE_LONG:
+	case ARGTYPE_LLONG:
 		return format_integer(stream, value, int_fmt, arguments);
 
 	case ARGTYPE_USHORT:
 	case ARGTYPE_UINT:
 	case ARGTYPE_ULONG:
+	case ARGTYPE_ULLONG:
 		if (int_fmt == INT_FMT_i || int_fmt == INT_FMT_default)
 			int_fmt = INT_FMT_u;
 		return format_integer(stream, value, int_fmt, arguments);
@@ -520,9 +522,11 @@ bool_lens_format_cb(struct lens *lens, FILE *stream,
 	case ARGTYPE_SHORT:
 	case ARGTYPE_INT:
 	case ARGTYPE_LONG:
+	case ARGTYPE_LLONG:
 	case ARGTYPE_USHORT:
 	case ARGTYPE_UINT:
 	case ARGTYPE_ULONG:
+	case ARGTYPE_ULLONG:
 	case ARGTYPE_CHAR:
 		if ((zero = value_is_zero(value, arguments)) < 0)
 			return -1;
@@ -578,9 +582,11 @@ string_lens_format_cb(struct lens *lens, FILE *stream,
 	case ARGTYPE_SHORT:
 	case ARGTYPE_INT:
 	case ARGTYPE_LONG:
+	case ARGTYPE_LLONG:
 	case ARGTYPE_USHORT:
 	case ARGTYPE_UINT:
 	case ARGTYPE_ULONG:
+	case ARGTYPE_ULLONG:
 		return toplevel_format_lens(lens, stream, value,
 					    arguments, INT_FMT_default);
 
diff --git a/printf.c b/printf.c
index 9aa68a5..773d104 100644
--- a/printf.c
+++ b/printf.c
@@ -35,7 +35,7 @@
 struct param_enum {
 	struct value array;
 	int percent;
-	size_t *future_length;
+	unsigned long long *future_length;
 	char *format;
 	char const *ptr;
 	char const *end;
@@ -101,15 +101,15 @@ form_next_param(struct param_enum *self,
 		struct arg_type_info *infop)
 {
 	/* XXX note: Some types are wrong because we lack
-	   ARGTYPE_LONGLONG, ARGTYPE_UCHAR and ARGTYPE_SCHAR.  */
+	   ARGTYPE_UCHAR and ARGTYPE_SCHAR.  */
 	assert(lng <= 2);
 	assert(hlf <= 2);
 	static enum arg_type ints[] =
 		{ ARGTYPE_CHAR, ARGTYPE_SHORT, ARGTYPE_INT,
-		  ARGTYPE_LONG, ARGTYPE_ULONG };
+		  ARGTYPE_LONG, ARGTYPE_LLONG };
 	static enum arg_type uints[] =
 		{ ARGTYPE_CHAR, ARGTYPE_USHORT, ARGTYPE_UINT,
-		  ARGTYPE_ULONG, ARGTYPE_ULONG };
+		  ARGTYPE_ULONG, ARGTYPE_ULLONG };
 
 	struct arg_type_info *elt_info = NULL;
 	if (format_type == ARGTYPE_ARRAY || format_type == ARGTYPE_POINTER)
@@ -343,7 +343,7 @@ static enum param_status
 param_printf_stop(struct param_enum *self, struct value *value)
 {
 	if (self->future_length != NULL
-	    && value_extract_word(value, (long *)self->future_length, NULL) < 0)
+	    && value_extract_word(value, (long long *)self->future_length, NULL) < 0)
 		drop_future_length(self);
 
 	return PPCB_CONT;
diff --git a/read_config_file.c b/read_config_file.c
index e247436..98278ac 100644
--- a/read_config_file.c
+++ b/read_config_file.c
@@ -79,6 +79,8 @@ parse_arg_type(char **name, enum arg_type *ret)
 	KEYWORD("uint", ARGTYPE_UINT);
 	KEYWORD("long", ARGTYPE_LONG);
 	KEYWORD("ulong", ARGTYPE_ULONG);
+	KEYWORD("llong", ARGTYPE_LLONG);
+	KEYWORD("ullong", ARGTYPE_ULLONG);
 	KEYWORD("char", ARGTYPE_CHAR);
 	KEYWORD("short", ARGTYPE_SHORT);
 	KEYWORD("ushort", ARGTYPE_USHORT);
@@ -912,6 +914,8 @@ parse_nonpointer_type(char **str, struct param **extra_param, size_t param_num,
 	case ARGTYPE_UINT:
 	case ARGTYPE_LONG:
 	case ARGTYPE_ULONG:
+	case ARGTYPE_LLONG:
+	case ARGTYPE_ULLONG:
 	case ARGTYPE_CHAR:
 	case ARGTYPE_SHORT:
 	case ARGTYPE_USHORT:
diff --git a/sysdeps/linux-gnu/ia64/fetch.c b/sysdeps/linux-gnu/ia64/fetch.c
index 54dc5b8..3828dd1 100644
--- a/sysdeps/linux-gnu/ia64/fetch.c
+++ b/sysdeps/linux-gnu/ia64/fetch.c
@@ -433,6 +433,8 @@ arch_fetch_arg_next(struct fetch_context *ctx, enum tof type,
 	case ARGTYPE_UINT:
 	case ARGTYPE_LONG:
 	case ARGTYPE_ULONG:
+	case ARGTYPE_LLONG:
+	case ARGTYPE_ULLONG:
 	case ARGTYPE_POINTER:
 		return allocate_arg(ctx, proc, info, valuep);
 
@@ -467,6 +469,8 @@ arch_fetch_retval(struct fetch_context *ctx, enum tof type,
 	case ARGTYPE_UINT:
 	case ARGTYPE_LONG:
 	case ARGTYPE_ULONG:
+	case ARGTYPE_LLONG:
+	case ARGTYPE_ULLONG:
 	case ARGTYPE_POINTER:
 	case ARGTYPE_STRUCT:
 		return allocate_ret(ctx, proc, info, valuep);
diff --git a/sysdeps/linux-gnu/m68k/fetch.c b/sysdeps/linux-gnu/m68k/fetch.c
index f6d8a0b..0870c82 100644
--- a/sysdeps/linux-gnu/m68k/fetch.c
+++ b/sysdeps/linux-gnu/m68k/fetch.c
@@ -170,6 +170,8 @@ arch_fetch_retval(struct fetch_context *context, enum tof type,
 	case ARGTYPE_UINT:
 	case ARGTYPE_LONG:
 	case ARGTYPE_ULONG:
+	case ARGTYPE_LLONG:
+	case ARGTYPE_ULLONG:
 	case ARGTYPE_CHAR:
 	case ARGTYPE_SHORT:
 	case ARGTYPE_USHORT:
diff --git a/sysdeps/linux-gnu/ppc/fetch.c b/sysdeps/linux-gnu/ppc/fetch.c
index 9963a1e..6fa5b73 100644
--- a/sysdeps/linux-gnu/ppc/fetch.c
+++ b/sysdeps/linux-gnu/ppc/fetch.c
@@ -309,6 +309,8 @@ allocate_argument(struct fetch_context *ctx, struct Process *proc,
 	case ARGTYPE_UINT:
 	case ARGTYPE_LONG:
 	case ARGTYPE_ULONG:
+	case ARGTYPE_LLONG:
+	case ARGTYPE_ULLONG:
 	case ARGTYPE_POINTER:
 		break;
 
diff --git a/sysdeps/linux-gnu/ppc/trace.c b/sysdeps/linux-gnu/ppc/trace.c
index 4357a1e..c1e9e2e 100644
--- a/sysdeps/linux-gnu/ppc/trace.c
+++ b/sysdeps/linux-gnu/ppc/trace.c
@@ -197,6 +197,10 @@ arch_type_sizeof(struct Process *proc, struct arg_type_info *info)
 	case ARGTYPE_POINTER:
 		return proc->e_machine == EM_PPC64 ? 8 : 4;
 
+	case ARGTYPE_LLONG:
+	case ARGTYPE_ULLONG:
+		return 8;
+
 	case ARGTYPE_FLOAT:
 		return 4;
 	case ARGTYPE_DOUBLE:
@@ -233,6 +237,8 @@ arch_type_alignof(struct Process *proc, struct arg_type_info *info)
 	case ARGTYPE_UINT:
 	case ARGTYPE_LONG:
 	case ARGTYPE_ULONG:
+	case ARGTYPE_LLONG:
+	case ARGTYPE_ULLONG:
 	case ARGTYPE_POINTER:
 	case ARGTYPE_FLOAT:
 	case ARGTYPE_DOUBLE:
diff --git a/sysdeps/linux-gnu/s390/fetch.c b/sysdeps/linux-gnu/s390/fetch.c
index fa8f42d..b01a71a 100644
--- a/sysdeps/linux-gnu/s390/fetch.c
+++ b/sysdeps/linux-gnu/s390/fetch.c
@@ -252,6 +252,8 @@ arch_fetch_arg_next(struct fetch_context *ctx, enum tof type,
 	case ARGTYPE_UINT:
 	case ARGTYPE_LONG:
 	case ARGTYPE_ULONG:
+	case ARGTYPE_LLONG:
+	case ARGTYPE_ULLONG:
 	case ARGTYPE_CHAR:
 	case ARGTYPE_SHORT:
 	case ARGTYPE_USHORT:
diff --git a/sysdeps/linux-gnu/s390/trace.c b/sysdeps/linux-gnu/s390/trace.c
index b9e05ff..6ded4fb 100644
--- a/sysdeps/linux-gnu/s390/trace.c
+++ b/sysdeps/linux-gnu/s390/trace.c
@@ -200,6 +200,10 @@ arch_type_sizeof(struct Process *proc, struct arg_type_info *info)
 	case ARGTYPE_POINTER:
 		return proc->e_class == ELFCLASS64 ? 8 : 4;
 
+	case ARGTYPE_LLONG:
+	case ARGTYPE_ULLONG:
+		return 8;
+
 	case ARGTYPE_FLOAT:
 		return 4;
 	case ARGTYPE_DOUBLE:
@@ -240,6 +244,8 @@ arch_type_alignof(struct Process *proc, struct arg_type_info *info)
 
 	case ARGTYPE_LONG:
 	case ARGTYPE_ULONG:
+	case ARGTYPE_LLONG:
+	case ARGTYPE_ULLONG:
 	case ARGTYPE_POINTER:
 		return proc->e_class == ELFCLASS64 ? 8 : 4;
 
diff --git a/sysdeps/linux-gnu/x86/fetch.c b/sysdeps/linux-gnu/x86/fetch.c
index 4dab4cc..b9ed8f1 100644
--- a/sysdeps/linux-gnu/x86/fetch.c
+++ b/sysdeps/linux-gnu/x86/fetch.c
@@ -259,7 +259,13 @@ allocate_integer(struct fetch_context *context, struct value *valuep,
 			HANDLE(0, rax);
 			HANDLE(1, rdx);
 #else
-			HANDLE(0, eax);
+		case 0:  // u64 return in EAX:EDX
+			copy_int_register(context, valuep,
+					  context->iregs.eax, offset);
+			if(sz == 8)
+				copy_int_register(context, valuep,
+						  context->iregs.edx, offset + 4);
+			return CLASS_INTEGER;
 #endif
 		default:
 			assert(!"Too many return value classes.");
@@ -448,9 +454,10 @@ classify(struct Process *proc, struct fetch_context *context,
 	case ARGTYPE_UINT:
 	case ARGTYPE_LONG:
 	case ARGTYPE_ULONG:
+	case ARGTYPE_LLONG:
+	case ARGTYPE_ULLONG:
 
 	case ARGTYPE_POINTER:
-		/* and LONGLONG */
 		/* CLASS_INTEGER */
 		classes[0] = CLASS_INTEGER;
 		return 1;
@@ -470,7 +477,7 @@ classify(struct Process *proc, struct fetch_context *context,
 		 * passed by value.  */
 		assert(expr_is_compile_constant(info->u.array_info.length));
 
-		long l;
+		long long l;
 		if (expr_eval_constant(info->u.array_info.length, &l) < 0)
 			return -1;
 
@@ -609,6 +616,8 @@ arch_fetch_retval_32(struct fetch_context *context, enum tof type,
 	case ARGTYPE_UINT:
 	case ARGTYPE_LONG:
 	case ARGTYPE_ULONG:
+	case ARGTYPE_LLONG:
+	case ARGTYPE_ULLONG:
 	case ARGTYPE_CHAR:
 	case ARGTYPE_SHORT:
 	case ARGTYPE_USHORT:
diff --git a/sysdeps/linux-gnu/x86/trace.c b/sysdeps/linux-gnu/x86/trace.c
index ed8bdb4..802bd0f 100644
--- a/sysdeps/linux-gnu/x86/trace.c
+++ b/sysdeps/linux-gnu/x86/trace.c
@@ -134,6 +134,10 @@ arch_type_sizeof(struct Process *proc, struct arg_type_info *info)
 	case ARGTYPE_POINTER:
 		return proc->e_machine == EM_X86_64 ? 8 : 4;
 
+	case ARGTYPE_LLONG:
+	case ARGTYPE_ULLONG:
+		return 8;
+
 	case ARGTYPE_FLOAT:
 		return 4;
 	case ARGTYPE_DOUBLE:
@@ -175,6 +179,8 @@ arch_type_alignof(struct Process *proc, struct arg_type_info *info)
 
 	case ARGTYPE_LONG:
 	case ARGTYPE_ULONG:
+	case ARGTYPE_LLONG:
+	case ARGTYPE_ULLONG:
 	case ARGTYPE_POINTER:
 		return proc->e_machine == EM_X86_64 ? 8 : 4;
 
diff --git a/type.c b/type.c
index 3ce8563..0880e5b 100644
--- a/type.c
+++ b/type.c
@@ -43,6 +43,8 @@ type_get_simple(enum arg_type type)
 	HANDLE(ARGTYPE_UINT)
 	HANDLE(ARGTYPE_LONG)
 	HANDLE(ARGTYPE_ULONG)
+	HANDLE(ARGTYPE_LLONG)
+	HANDLE(ARGTYPE_ULLONG)
 	HANDLE(ARGTYPE_CHAR)
 	HANDLE(ARGTYPE_SHORT)
 	HANDLE(ARGTYPE_USHORT)
@@ -239,6 +241,8 @@ type_destroy(struct arg_type_info *info)
 	case ARGTYPE_UINT:
 	case ARGTYPE_LONG:
 	case ARGTYPE_ULONG:
+	case ARGTYPE_LLONG:
+	case ARGTYPE_ULLONG:
 	case ARGTYPE_CHAR:
 	case ARGTYPE_SHORT:
 	case ARGTYPE_USHORT:
@@ -312,6 +316,10 @@ type_sizeof(struct Process *proc, struct arg_type_info *type)
 	case ARGTYPE_ULONG:
 		return sizeof(long);
 
+	case ARGTYPE_LLONG:
+	case ARGTYPE_ULLONG:
+		return sizeof(long long);
+
 	case ARGTYPE_FLOAT:
 		return sizeof(float);
 
@@ -328,7 +336,7 @@ type_sizeof(struct Process *proc, struct arg_type_info *type)
 
 	case ARGTYPE_ARRAY:
 		if (expr_is_compile_constant(type->u.array_info.length)) {
-			long l;
+			long long l;
 			if (expr_eval_constant(type->u.array_info.length,
 					       &l) < 0)
 				return -1;
@@ -369,6 +377,7 @@ type_alignof(struct Process *proc, struct arg_type_info *type)
 	struct { char c; short s; } cs;
 	struct { char c; int i; } ci;
 	struct { char c; long l; } cl;
+	struct { char c; long long ll; } cll;
 	struct { char c; void* p; } cp;
 	struct { char c; float f; } cf;
 	struct { char c; double d; } cd;
@@ -377,12 +386,16 @@ type_alignof(struct Process *proc, struct arg_type_info *type)
 	static size_t short_alignment = alignof(s, cs);
 	static size_t int_alignment = alignof(i, ci);
 	static size_t long_alignment = alignof(l, cl);
+	static size_t llong_alignment = alignof(ll, cll);
 	static size_t ptr_alignment = alignof(p, cp);
 	static size_t float_alignment = alignof(f, cf);
 	static size_t double_alignment = alignof(d, cd);
 
 	switch (type->type) {
 		size_t alignment;
+	case ARGTYPE_LLONG:
+	case ARGTYPE_ULLONG:
+		return llong_alignment;
 	case ARGTYPE_LONG:
 	case ARGTYPE_ULONG:
 		return long_alignment;
@@ -467,7 +480,7 @@ type_aggregate_size(struct arg_type_info *info)
 	       || info->type == ARGTYPE_ARRAY);
 
 	switch (info->type) {
-		long ret;
+		long long ret;
 	case ARGTYPE_ARRAY:
 		if (expr_eval_constant(info->u.array_info.length, &ret) < 0)
 			return (size_t)-1;
@@ -489,6 +502,8 @@ type_is_integral(enum arg_type type)
 	case ARGTYPE_UINT:
 	case ARGTYPE_LONG:
 	case ARGTYPE_ULONG:
+	case ARGTYPE_LLONG:
+	case ARGTYPE_ULLONG:
 	case ARGTYPE_CHAR:
 	case ARGTYPE_SHORT:
 	case ARGTYPE_USHORT:
@@ -517,11 +532,13 @@ type_is_signed(enum arg_type type)
 	case ARGTYPE_SHORT:
 	case ARGTYPE_INT:
 	case ARGTYPE_LONG:
+	case ARGTYPE_LLONG:
 		return 1;
 
+	case ARGTYPE_USHORT:
 	case ARGTYPE_UINT:
 	case ARGTYPE_ULONG:
-	case ARGTYPE_USHORT:
+	case ARGTYPE_ULLONG:
 		return 0;
 
 	case ARGTYPE_VOID:
@@ -551,8 +568,10 @@ type_get_fp_equivalent(struct arg_type_info *info)
 	case ARGTYPE_SHORT:
 	case ARGTYPE_INT:
 	case ARGTYPE_LONG:
+	case ARGTYPE_LLONG:
 	case ARGTYPE_UINT:
 	case ARGTYPE_ULONG:
+	case ARGTYPE_ULLONG:
 	case ARGTYPE_USHORT:
 	case ARGTYPE_VOID:
 	case ARGTYPE_ARRAY:
diff --git a/type.h b/type.h
index e8dec71..95838a0 100644
--- a/type.h
+++ b/type.h
@@ -32,6 +32,8 @@ enum arg_type {
 	ARGTYPE_UINT,
 	ARGTYPE_LONG,
 	ARGTYPE_ULONG,
+	ARGTYPE_LLONG,
+	ARGTYPE_ULLONG,
 	ARGTYPE_CHAR,
 	ARGTYPE_SHORT,
 	ARGTYPE_USHORT,
diff --git a/value.c b/value.c
index f89570f..3209b9f 100644
--- a/value.c
+++ b/value.c
@@ -219,8 +219,8 @@ value_size(struct value *val, struct value_dict *arguments)
 		      arguments, &length) < 0)
 		return (size_t)-1;
 
-	size_t l;
-	int o = value_extract_word(&length, (long *)&l, arguments);
+	uint64_t l;
+	int o = value_extract_word(&length, (long long *)&l, arguments);
 	value_destroy(&length);
 
 	if (o < 0)
@@ -278,7 +278,7 @@ value_init_deref(struct value *ret_val, struct value *valp)
 
 	/* Note: extracting a pointer value should not need value_dict
 	 * with function arguments.  */
-	long l;
+	long long l;
 	if (value_extract_word(valp, &l, NULL) < 0)
 		return -1;
 
@@ -368,7 +368,7 @@ value_extract_buf_sz(struct value *value, unsigned char *tgt, size_t sz,
 }
 
 int
-value_extract_word(struct value *value, long *retp,
+value_extract_word(struct value *value, long long *retp,
 		   struct value_dict *arguments)
 {
 	size_t sz = type_sizeof(value->inferior, value->type);
@@ -387,16 +387,16 @@ value_extract_word(struct value *value, long *retp,
 
 	switch (sz) {
 	case 1:
-		*retp = (long)u.u8;
+		*retp = (long long)u.u8;
 		return 0;
 	case 2:
-		*retp = (long)u.u16;
+		*retp = (long long)u.u16;
 		return 0;
 	case 4:
-		*retp = (long)u.u32;
+		*retp = (long long)u.u32;
 		return 0;
 	case 8:
-		*retp = (long)u.u64;
+		*retp = (long long)u.u64;
 		return 0;
 	default:
 		assert(sz != sz);
diff --git a/value.h b/value.h
index 795573c..a527667 100644
--- a/value.h
+++ b/value.h
@@ -52,7 +52,7 @@ struct value {
 	union {
 		void *address;  /* VAL_LOC_COPY, VAL_LOC_SHARED */
 		arch_addr_t inf_address;  /* VAL_LOC_INFERIOR */
-		long value;     /* VAL_LOC_WORD */
+		long long value;     /* VAL_LOC_WORD */
 		unsigned char buf[0];
 	} u;
 	enum value_location_t where;
@@ -137,7 +137,7 @@ size_t value_size(struct value *val, struct value_dict *arguments);
 
 /* Extract at most word-sized datum from the value.  Return 0 on
  * success or negative value on failure.  */
-int value_extract_word(struct value *val, long *retp,
+int value_extract_word(struct value *val, long long *retp,
 		       struct value_dict *arguments);
 
 /* Copy contents of VAL to DATA.  The buffer must be large enough to
diff --git a/zero.c b/zero.c
index bc119ee..ddb5e0d 100644
--- a/zero.c
+++ b/zero.c
@@ -58,7 +58,7 @@ static int
 zero_callback(struct value *ret_value, struct value *lhs,
 	      struct value *rhs, struct value_dict *arguments, void *data)
 {
-	long l;
+	long long l;
 	if (value_extract_word(rhs, &l, arguments) < 0)
 		return -1;
 	if (l < 0)
From: =?utf-8?b?0L3QsNCx?= <nabijaczlew...@nabijaczleweli.xyz>
Date: Wed, 26 Jul 2023 01:42:23 +0200
Subject: ltrace.conf: openat*(), getopt_long*() consistency, fseek*(),
 ftell*(), reallocarray(), pread*(), pwrite*(), lseek*() with whence enum,
 *readv*(), *writev*(), __cxa_finalize()

Of course, this assumes that symbols ending in 64 are the only ones
taking a 64-bit off_t, and thus the ones that don't take longs.
This holds on x86, but probably not any new arches which just don't have
the weird broken *64() symbols.
---
 etc/ltrace.conf | 42 +++++++++++++++++++++++++++++++++++++-----
 1 file changed, 37 insertions(+), 5 deletions(-)

diff --git a/etc/ltrace.conf b/etc/ltrace.conf
index 8f83986..855d373 100644
--- a/etc/ltrace.conf
+++ b/etc/ltrace.conf
@@ -55,15 +55,18 @@ int dlclose(addr);
 addr __errno_location();
 
 ; fcntl.h
-int open(string,int,octal);		; WARNING: 3rd argument may not be there
-int open64(string,int,octal);		; WARNING: 3rd argument may not be there
+typedef openat_fd = enum(AT_FDCWD=-100);
+int open(string,hex(int),octal);		; WARNING: 3rd argument may not be there
+int open64(string,hex(int),octal);		; WARNING: 3rd argument may not be there
+int openat(openat_fd,string,hex(int),octal);	; WARNING: 4th argument may not be there
+int openat64(openat_fd,string,hex(int),octal);	; WARNING: 4th argument may not be there
 
 ; fnmatch.h
 int fnmatch(string, string, int);
 
 ; getopt.h
-int getopt_long(int,addr,string,addr,int*);
-int getopt_long_only(int,addr,string,addr,addr);
+int getopt_long(int,addr,string,addr,+int*);
+int getopt_long_only(int,addr,string,addr,+int*);
 
 ; grp.h
 void endgrent();
@@ -194,6 +197,13 @@ ulong fread(addr,ulong,ulong,file);
 ulong fread_unlocked(addr,ulong,ulong,file);
 ulong fwrite(string,ulong,ulong,file);
 ulong fwrite_unlocked(string,ulong,ulong,file);
+typedef lseek_whence = enum(SEEK_SET=0, SEEK_CUR=1, SEEK_END=2, SEEK_DATA=3, SEEK_HOLE=4);
+int fseek(file,long,lseek_whence);
+int fseeko(file,long,lseek_whence);
+int fseeko64(file,llong,lseek_whence);
+long ftell(file);
+long ftello(file);
+llong ftello64(file);
 int pclose(addr);
 void perror(string);
 addr popen(string, string);
@@ -227,6 +237,7 @@ addr malloc(ulong);
 void qsort(addr,ulong,ulong,addr);
 int random();
 addr realloc(addr,ulong);
+addr reallocarray(addr,ulong,ulong);
 void srandom(uint);
 int system(string);
 
@@ -335,6 +346,8 @@ int isatty(int);
 int link(string,string);
 int mkdir(string,octal);
 long read(int, +string[retval], ulong);
+long pread(int,+string[retval],ulong,long);
+long pread64(int,+string[retval],ulong,llong);
 int rmdir(string);
 int seteuid(uint);
 int setgid(int);
@@ -350,11 +363,27 @@ string ttyname(int);
 int unlink(string);
 void usleep(uint);
 long write(int, string3, ulong);
+long pwrite(int,string3,ulong,long);
+long pwrite64(int,string3,ulong,llong);
 addr sbrk(long);
 int getpagesize();
-long lseek(int,long,int);
+long lseek(int,long,lseek_whence);
+long lseek64(int,llong,lseek_whence);
 int pipe(addr);
 
+; sys/uio.h
+typedef iovec = struct(string[elt2],ulong);
+long readv(int,+array(iovec,arg3),int);
+long writev(int,array(iovec,arg3),int);
+long preadv(int,+array(iovec,arg3),int,long);
+long pwritev(int,array(iovec,arg3),int,long);
+long preadv64(int,+array(iovec,arg3),int,llong);
+long pwritev64(int,array(iovec,arg3),int,llong);
+long preadv2(int,+array(iovec,arg3),int,long,hex(int));
+long pwritev2(int,array(iovec,arg3),int,long,hex(int));
+long preadv64v2(int,+array(iovec,arg3),int,llong,hex(int));
+long pwritev64v2(int,array(iovec,arg3),int,llong,hex(int));
+
 ; utmp.h
 void endutent();
 addr getutent();
@@ -414,6 +443,9 @@ addr acl_from_mode(octal);
 int acl_get_perm(addr,uint);
 string acl_to_any_text(addr,string,char,int);
 
+; cxxabi.h
+void __cxa_finalize(addr);
+
 ; other symbols not included above
 long a64l(string);
 string l64a(long);
From: =?utf-8?b?0L3QsNCx?= <nabijaczlew...@nabijaczleweli.xyz>
Date: Wed, 26 Jul 2023 02:55:43 +0200
Subject: Remove extraneous whitespace around [] and {}

Compare
pread64(3, "14044\n14045\n14046\n14047\n14048\n14"..., 65536, 73152)                                      = 65536
memmove(0x5769c1a4, "6\n", 2)                                                                             = 0x5769c1a4
memcpy(0x5769c1a0, "2496", 4)                                                                             = 0x5769c1a0
writev(1, [ { "24966\n", 6 }, { "24965\n", 6 }, { "24964\n", 6 }, { "24963\n", 6 }... ], 1024)            = 6144
writev(1, [ { "23942\n", 6 }, { "23941\n", 6 }, { "23940\n", 6 }, { "23939\n", 6 }... ], 1024)            = 6144
writev(1, [ { "22918\n", 6 }, { "22917\n", 6 }, { "22916\n", 6 }, { "22915\n", 6 }... ], 1024)            = 6144
writev(1, [ { "21894\n", 6 }, { "21893\n", 6 }, { "21892\n", 6 }, { "21891\n", 6 }... ], 1024)            = 6144
writev(1, [ { "20870\n", 6 }, { "20869\n", 6 }, { "20868\n", 6 }, { "20867\n", 6 }... ], 1024)            = 6144
writev(1, [ { "19846\n", 6 }, { "19845\n", 6 }, { "19844\n", 6 }, { "19843\n", 6 }... ], 1024)            = 6144
writev(1, [ { "18822\n", 6 }, { "18821\n", 6 }, { "18820\n", 6 }, { "18819\n", 6 }... ], 1024)            = 6144
writev(1, [ { "17798\n", 6 }, { "17797\n", 6 }, { "17796\n", 6 }, { "17795\n", 6 }... ], 1024)            = 6144
writev(1, [ { "16774\n", 6 }, { "16773\n", 6 }, { "16772\n", 6 }, { "16771\n", 6 }... ], 1024)            = 6144
writev(1, [ { "15750\n", 6 }, { "15749\n", 6 }, { "15748\n", 6 }, { "15747\n", 6 }... ], 1024)            = 6144
writev(1, [ { "14726\n", 6 }, { "14725\n", 6 }, { "14724\n", 6 }, { "14723\n", 6 }... ], 682)             = 4092
memcpy(0x5769c1a0, "14044\n", 6)                                                                          = 0x5769c1a0
pread64(3, "5\n1746\n1747\n1748\n1749\n1750\n1751\n"..., 65536, 7616)                                     = 65536
writev(1, [ { "14044\n", 6 }, { "14043\n", 6 }, { "14042\n", 6 }, { "14041\n", 6 }... ], 1024)            = 6144
writev(1, [ { "13020\n", 6 }, { "13019\n", 6 }, { "13018\n", 6 }, { "13017\n", 6 }... ], 1024)            = 6144
writev(1, [ { "11996\n", 6 }, { "11995\n", 6 }, { "11994\n", 6 }, { "11993\n", 6 }... ], 1024)            = 6144
writev(1, [ { "10972\n", 6 }, { "10971\n", 6 }, { "10970\n", 6 }, { "10969\n", 6 }... ], 1024)            = 6093
writev(1, [ { "9948\n", 5 }, { "9947\n", 5 }, { "9946\n", 5 }, { "9945\n", 5 }... ], 1024)                = 5120
writev(1, [ { "8924\n", 5 }, { "8923\n", 5 }, { "8922\n", 5 }, { "8921\n", 5 }... ], 1024)                = 5120
writev(1, [ { "7900\n", 5 }, { "7899\n", 5 }, { "7898\n", 5 }, { "7897\n", 5 }... ], 1024)                = 5120
writev(1, [ { "6876\n", 5 }, { "6875\n", 5 }, { "6874\n", 5 }, { "6873\n", 5 }... ], 1024)                = 5120
writev(1, [ { "5852\n", 5 }, { "5851\n", 5 }, { "5850\n", 5 }, { "5849\n", 5 }... ], 1024)                = 5120
writev(1, [ { "4828\n", 5 }, { "4827\n", 5 }, { "4826\n", 5 }, { "4825\n", 5 }... ], 1024)                = 5120
writev(1, [ { "3804\n", 5 }, { "3803\n", 5 }, { "3802\n", 5 }, { "3801\n", 5 }... ], 1024)                = 5120
writev(1, [ { "2780\n", 5 }, { "2779\n", 5 }, { "2778\n", 5 }, { "2777\n", 5 }... ], 1024)                = 5120
writev(1, [ { "1756\n", 5 }, { "1755\n", 5 }, { "1754\n", 5 }, { "1753\n", 5 }... ], 11)                  = 55
memcpy(0x5769c1a0, "5\n", 2)                                                                              = 0x5769c1a0
pread64(3, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14"..., 7616, 0)                                   = 7616
memmove(0x5769c1a3, "5\n", 2)                                                                             = 0x5769c1a3
memcpy(0x5769c1a0, "174", 3)                                                                              = 0x5769c1a0
writev(1, [ { "1745\n", 5 }, { "1744\n", 5 }, { "1743\n", 5 }, { "1742\n", 5 }... ], 1024)                = 4842
writev(1, [ { "721\n", 4 }, { "720\n", 4 }, { "719\n", 4 }, { "718\n", 4 }... ], 720)                     = 2774
memcpy(0x5769c1a0, "1\n", 2)                                                                              = 0x5769c1a0
writev(1, [ { "1\n", 2 } ], 1)                                                                            = 2
close(3)                                                                                                  = 0

To
pread64(3, "14044\n14045\n14046\n14047\n14048\n14"..., 65536, 73152)                                      = 65536
memmove(0x574c41a4, "6\n", 2)                                                                             = 0x574c41a4
memcpy(0x574c41a0, "2496", 4)                                                                             = 0x574c41a0
writev(1, [{"24966\n", 6}, {"24965\n", 6}, {"24964\n", 6}, {"24963\n", 6}...], 1024)                      = 6144
writev(1, [{"23942\n", 6}, {"23941\n", 6}, {"23940\n", 6}, {"23939\n", 6}...], 1024)                      = 6144
writev(1, [{"22918\n", 6}, {"22917\n", 6}, {"22916\n", 6}, {"22915\n", 6}...], 1024)                      = 6144
writev(1, [{"21894\n", 6}, {"21893\n", 6}, {"21892\n", 6}, {"21891\n", 6}...], 1024)                      = 6144
writev(1, [{"20870\n", 6}, {"20869\n", 6}, {"20868\n", 6}, {"20867\n", 6}...], 1024)                      = 6144
writev(1, [{"19846\n", 6}, {"19845\n", 6}, {"19844\n", 6}, {"19843\n", 6}...], 1024)                      = 6144
writev(1, [{"18822\n", 6}, {"18821\n", 6}, {"18820\n", 6}, {"18819\n", 6}...], 1024)                      = 6144
writev(1, [{"17798\n", 6}, {"17797\n", 6}, {"17796\n", 6}, {"17795\n", 6}...], 1024)                      = 6144
writev(1, [{"16774\n", 6}, {"16773\n", 6}, {"16772\n", 6}, {"16771\n", 6}...], 1024)                      = 6144
writev(1, [{"15750\n", 6}, {"15749\n", 6}, {"15748\n", 6}, {"15747\n", 6}...], 1024)                      = 6144
writev(1, [{"14726\n", 6}, {"14725\n", 6}, {"14724\n", 6}, {"14723\n", 6}...], 682)                       = 4092
memcpy(0x574c41a0, "14044\n", 6)                                                                          = 0x574c41a0
pread64(3, "5\n1746\n1747\n1748\n1749\n1750\n1751\n"..., 65536, 7616)                                     = 65536
writev(1, [{"14044\n", 6}, {"14043\n", 6}, {"14042\n", 6}, {"14041\n", 6}...], 1024)                      = 6144
writev(1, [{"13020\n", 6}, {"13019\n", 6}, {"13018\n", 6}, {"13017\n", 6}...], 1024)                      = 6144
writev(1, [{"11996\n", 6}, {"11995\n", 6}, {"11994\n", 6}, {"11993\n", 6}...], 1024)                      = 6144
writev(1, [{"10972\n", 6}, {"10971\n", 6}, {"10970\n", 6}, {"10969\n", 6}...], 1024)                      = 6093
writev(1, [{"9948\n", 5}, {"9947\n", 5}, {"9946\n", 5}, {"9945\n", 5}...], 1024)                          = 5120
writev(1, [{"8924\n", 5}, {"8923\n", 5}, {"8922\n", 5}, {"8921\n", 5}...], 1024)                          = 5120
writev(1, [{"7900\n", 5}, {"7899\n", 5}, {"7898\n", 5}, {"7897\n", 5}...], 1024)                          = 5120
writev(1, [{"6876\n", 5}, {"6875\n", 5}, {"6874\n", 5}, {"6873\n", 5}...], 1024)                          = 5120
writev(1, [{"5852\n", 5}, {"5851\n", 5}, {"5850\n", 5}, {"5849\n", 5}...], 1024)                          = 5120
writev(1, [{"4828\n", 5}, {"4827\n", 5}, {"4826\n", 5}, {"4825\n", 5}...], 1024)                          = 5120
writev(1, [{"3804\n", 5}, {"3803\n", 5}, {"3802\n", 5}, {"3801\n", 5}...], 1024)                          = 5120
writev(1, [{"2780\n", 5}, {"2779\n", 5}, {"2778\n", 5}, {"2777\n", 5}...], 1024)                          = 5120
writev(1, [{"1756\n", 5}, {"1755\n", 5}, {"1754\n", 5}, {"1753\n", 5}...], 11)                            = 55
memcpy(0x574c41a0, "5\n", 2)                                                                              = 0x574c41a0
pread64(3, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14"..., 7616, 0)                                   = 7616
memmove(0x574c41a3, "5\n", 2)                                                                             = 0x574c41a3
memcpy(0x574c41a0, "174", 3)                                                                              = 0x574c41a0
writev(1, [{"1745\n", 5}, {"1744\n", 5}, {"1743\n", 5}, {"1742\n", 5}...], 1024)                          = 4842
writev(1, [{"721\n", 4}, {"720\n", 4}, {"719\n", 4}, {"718\n", 4}...], 720)                               = 2774
memcpy(0x574c41a0, "1\n", 2)                                                                              = 0x574c41a0
writev(1, [{"1\n", 2}], 1)                                                                                = 2
close(3)                                                                                                  = 0
---
 lens_default.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/lens_default.c b/lens_default.c
index 2fd4915..71d9584 100644
--- a/lens_default.c
+++ b/lens_default.c
@@ -231,7 +231,7 @@ static int
 format_struct(FILE *stream, struct value *value, struct value_dict *arguments)
 {
 	int written = 0;
-	if (acc_fprintf(&written, stream, "{ ") < 0)
+	if (acc_fprintf(&written, stream, "{") < 0)
 		return -1;
 
 	int need_delim = 0;
@@ -250,7 +250,7 @@ format_struct(FILE *stream, struct value *value, struct value_dict *arguments)
 
 		written += o;
 	}
-	if (acc_fprintf(&written, stream, " }") < 0)
+	if (acc_fprintf(&written, stream, "}") < 0)
 		return -1;
 	return written;
 }
@@ -425,7 +425,7 @@ toplevel_format_lens(struct lens *lens, FILE *stream,
 	case ARGTYPE_ARRAY:
 		return format_array(stream, value, arguments,
 				    value->type->u.array_info.length,
-				    options.arraylen, 1, "[ ", " ]", ", ");
+				    options.arraylen, 1, "[", "]", ", ");
 	}
 	abort();
 }

Attachment: signature.asc
Description: PGP signature

Reply via email to