[16/59] libctf: add ctf_type_kind_forwarded

Message ID 20200630233146.338613-17-nick.alcock@oracle.com
State New
Headers show
Series
  • Deduplicating CTF linker
Related show

Commit Message

H.J. Lu via Binutils June 30, 2020, 11:31 p.m.
This is just like ctf_type_kind, except that forwards get the
type of the thing being pointed to rather than CTF_K_FORWARD.

include/
	* ctf-api.h (ctf_type_kind_forwarded): New.
libctf/
	* ctf-types.c (ctf_type_kind_forwarded): New.
---
 include/ctf-api.h  |  1 +
 libctf/ctf-types.c | 20 ++++++++++++++++++++
 libctf/libctf.ver  |  1 +
 3 files changed, 22 insertions(+)

-- 
2.27.0.247.g3dff7de930

Patch

diff --git a/include/ctf-api.h b/include/ctf-api.h
index 363b5c258ca..87446a5f7d1 100644
--- a/include/ctf-api.h
+++ b/include/ctf-api.h
@@ -328,6 +328,7 @@  extern const char *ctf_type_name_raw (ctf_file_t *, ctf_id_t);
 extern ssize_t ctf_type_size (ctf_file_t *, ctf_id_t);
 extern ssize_t ctf_type_align (ctf_file_t *, ctf_id_t);
 extern int ctf_type_kind (ctf_file_t *, ctf_id_t);
+extern int ctf_type_kind_forwarded (ctf_file_t *, ctf_id_t);
 extern ctf_id_t ctf_type_reference (ctf_file_t *, ctf_id_t);
 extern ctf_id_t ctf_type_pointer (ctf_file_t *, ctf_id_t);
 extern int ctf_type_encoding (ctf_file_t *, ctf_id_t, ctf_encoding_t *);
diff --git a/libctf/ctf-types.c b/libctf/ctf-types.c
index ce3890c33a6..d8f848cf893 100644
--- a/libctf/ctf-types.c
+++ b/libctf/ctf-types.c
@@ -677,6 +677,26 @@  ctf_type_kind (ctf_file_t *fp, ctf_id_t type)
   return kind;
 }
 
+/* Return the kind of this type, except, for forwards, return the kind of thing
+   this is a forward to.  */
+int
+ctf_type_kind_forwarded (ctf_file_t *fp, ctf_id_t type)
+{
+  int kind;
+  const ctf_type_t *tp;
+
+  if ((kind = ctf_type_kind (fp, type)) < 0)
+    return -1;			/* errno is set for us.  */
+
+  if (kind != CTF_K_FORWARD)
+    return kind;
+
+  if ((tp = ctf_lookup_by_id (&fp, type)) == NULL)
+    return -1;			/* errno is set for us.  */
+
+  return tp->ctt_type;
+}
+
 /* If the type is one that directly references another type (such as POINTER),
    then return the ID of the type to which it refers.  */
 
diff --git a/libctf/libctf.ver b/libctf/libctf.ver
index 30a0b087bd6..b8c5133d3f9 100644
--- a/libctf/libctf.ver
+++ b/libctf/libctf.ver
@@ -63,6 +63,7 @@  LIBCTF_1.0 {
 	ctf_type_size;
 	ctf_type_align;
 	ctf_type_kind;
+	ctf_type_kind_forwarded;
 	ctf_type_reference;
 	ctf_type_pointer;
 	ctf_type_encoding;