[PATCH 4/9] Move uinteger_pow gdb/valarith.c to gdb/utils.c and make it public

Joel Brobecker
2020-11-08T06:30:44Z

This is a generic function which I would like to use in a followup
patch adding support for fixed-point types. So this commit moves it
out of valarith.c into util.c, and makes it non-static.

gdb/ChangeLog:

* utils.h (uinteger_pow): Add declaration.
* utils.c (uinteger_pow): Moved here (without changes)...
* valarith.c (uinteger_pow): ... from here.
---
gdb/utils.c | 30 ++++++++++++++++++++++++++++++
gdb/utils.h | 7 +++++++
gdb/valarith.c | 31 -------------------------------
3 files changed, 37 insertions(+), 31 deletions(-)

diff --git a/gdb/utils.c b/gdb/utils.c
index ab931c3..3226656 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -709,6 +709,36 @@ myread (int desc, char *addr, int len)
return orglen;
}

+/* See utils.h. */
+
+ULONGEST
+uinteger_pow (ULONGEST v1, LONGEST v2)
+{
+ if (v2 < 0)
+ {
+ if (v1 == 0)
+ error (_("Attempt to raise 0 to negative power."));
+ else
+ return 0;
+ }
+ else
+ {
+ /* The Russian Peasant's Algorithm. */
+ ULONGEST v;
+
+ v = 1;
+ for (;;)
+ {
+ if (v2 & 1L)
+ v *= v1;
+ v2 >>= 1;
+ if (v2 == 0)
+ return v;
+ v1 *= v1;
+ }
+ }
+}
+
void
print_spaces (int n, struct ui_file *file)
{
diff --git a/gdb/utils.h b/gdb/utils.h
index 6948908..a8c65ed 100644
--- a/gdb/utils.h
+++ b/gdb/utils.h
@@ -593,6 +593,13 @@ extern pid_t wait_to_die_with_timeout (pid_t pid, int *status, int timeout);

extern int myread (int, char *, int);

+/* Integer exponentiation: Return V1**V2, where both arguments
+ are integers.
+
+ Requires V1 != 0 if V2 < 0.
+ Returns 1 for 0 ** 0. */
+extern ULONGEST uinteger_pow (ULONGEST v1, LONGEST v2);
+
/* Resource limits used by getrlimit and setrlimit. */

enum resource_limit_kind
diff --git a/gdb/valarith.c b/gdb/valarith.c
index 21b597a..f6caf3d 100644
--- a/gdb/valarith.c
+++ b/gdb/valarith.c
@@ -819,37 +819,6 @@ integer_pow (LONGEST v1, LONGEST v2)
}
}

-/* Integer exponentiation: V1**V2, where both arguments are
- integers. Requires V1 != 0 if V2 < 0. Returns 1 for 0 ** 0. */
-
-static ULONGEST
-uinteger_pow (ULONGEST v1, LONGEST v2)
-{
- if (v2 < 0)
- {
- if (v1 == 0)
- error (_("Attempt to raise 0 to negative power."));
- else
- return 0;
- }
- else
- {
- /* The Russian Peasant's Algorithm. */
- ULONGEST v;
-
- v = 1;
- for (;;)
- {
- if (v2 & 1L)
- v *= v1;
- v2 >>= 1;
- if (v2 == 0)
- return v;
- v1 *= v1;
- }
- }
-}
-
/* Obtain argument values for binary operation, converting from
other types if one of them is not floating point. */
static void
--
2.1.4