[binutils-gdb] libctf, ld: fix formatting of forwards to unions and enums

Nick Alcock nix@sourceware.org
Tue Jan 5 15:03:07 GMT 2021


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=b4b6ea46807ec9c01ed4f4f18a50840358d16c28

commit b4b6ea46807ec9c01ed4f4f18a50840358d16c28
Author: Nick Alcock <nick.alcock@oracle.com>
Date:   Tue Jan 5 13:25:56 2021 +0000

    libctf, ld: fix formatting of forwards to unions and enums
    
    The type printer was unconditionally printing these as if they were
    forwards to structs, even if they were forwards to unions or enums.
    
    ld/ChangeLog
    2021-01-05  Nick Alcock  <nick.alcock@oracle.com>
    
            * testsuite/ld-ctf/enum-forward.c: New test.
            * testsuite/ld-ctf/enum-forward.c: New results.
    
    libctf/ChangeLog
    2021-01-05  Nick Alcock  <nick.alcock@oracle.com>
    
            * ctf-types.c (ctf_type_aname): Print forwards to unions and enums
            properly.

Diff:
---
 ld/ChangeLog                       |  5 +++++
 ld/testsuite/ld-ctf/enum-forward.c |  2 ++
 ld/testsuite/ld-ctf/enum-forward.d | 20 ++++++++++++++++++++
 libctf/ChangeLog                   |  5 +++++
 libctf/ctf-types.c                 | 21 ++++++++++++++++++++-
 5 files changed, 52 insertions(+), 1 deletion(-)

diff --git a/ld/ChangeLog b/ld/ChangeLog
index 213aed02ecb..b939f616f3a 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,8 @@
+2021-01-05  Nick Alcock  <nick.alcock@oracle.com>
+
+	* testsuite/ld-ctf/enum-forward.c: New test.
+	* testsuite/ld-ctf/enum-forward.c: New results.
+
 2021-01-05  Nick Alcock  <nick.alcock@oracle.com>
 
 	* testsuite/ld-ctf/array.d: Adjust for dumper changes.
diff --git a/ld/testsuite/ld-ctf/enum-forward.c b/ld/testsuite/ld-ctf/enum-forward.c
new file mode 100644
index 00000000000..e0a64b85c74
--- /dev/null
+++ b/ld/testsuite/ld-ctf/enum-forward.c
@@ -0,0 +1,2 @@
+enum vibgyor;
+char * (*get_color_name) (enum vibgyor);
diff --git a/ld/testsuite/ld-ctf/enum-forward.d b/ld/testsuite/ld-ctf/enum-forward.d
new file mode 100644
index 00000000000..a83651eb4b8
--- /dev/null
+++ b/ld/testsuite/ld-ctf/enum-forward.d
@@ -0,0 +1,20 @@
+#as:
+#source: enum-forward.c
+#objdump: --ctf=.ctf
+#ld: -shared
+#name: Forwards to enums
+
+.*: +file format .*
+
+Contents of CTF section .ctf:
+
+  Header:
+    Magic number: 0xdff2
+    Version: 4 \(CTF_VERSION_3\)
+#...
+    Type section:	.* \(0x48 bytes\)
+#...
+  Data objects:
+    get_color_name -> 0x[0-9a-f]*: \(kind 3\) char \*\*\(\*\) \(enum vibgyor\) \(size 0x[0-9a-f]*\) \(aligned at 0x[0-9a-f]*\) -> 0x[0-9a-f]*: \(kind 5\) char \*\(\*\) \(enum vibgyor\) \(aligned at 0x[0-9a-f]*\)
+
+#...
diff --git a/libctf/ChangeLog b/libctf/ChangeLog
index 4c62cf1f2fa..0aaf3067ab6 100644
--- a/libctf/ChangeLog
+++ b/libctf/ChangeLog
@@ -1,3 +1,8 @@
+2021-01-05  Nick Alcock  <nick.alcock@oracle.com>
+
+	* ctf-types.c (ctf_type_aname): Print forwards to unions and enums
+	properly.
+
 2021-01-05  Nick Alcock  <nick.alcock@oracle.com>
 
 	* ctf-impl.h (ctf_dict_t) <ctf_pptrtab>: New.
diff --git a/libctf/ctf-types.c b/libctf/ctf-types.c
index 6275be0058d..4129fbc7b83 100644
--- a/libctf/ctf-types.c
+++ b/libctf/ctf-types.c
@@ -834,7 +834,6 @@ ctf_type_aname (ctf_dict_t *fp, ctf_id_t type)
 	      }
 	      break;
 	    case CTF_K_STRUCT:
-	    case CTF_K_FORWARD:
 	      ctf_decl_sprintf (&cd, "struct %s", name);
 	      break;
 	    case CTF_K_UNION:
@@ -843,6 +842,26 @@ ctf_type_aname (ctf_dict_t *fp, ctf_id_t type)
 	    case CTF_K_ENUM:
 	      ctf_decl_sprintf (&cd, "enum %s", name);
 	      break;
+	    case CTF_K_FORWARD:
+	      {
+		switch (ctf_type_kind_forwarded (fp, cdp->cd_type))
+		  {
+		  case CTF_K_STRUCT:
+		    ctf_decl_sprintf (&cd, "struct %s", name);
+		    break;
+		  case CTF_K_UNION:
+		    ctf_decl_sprintf (&cd, "union %s", name);
+		    break;
+		  case CTF_K_ENUM:
+		    ctf_decl_sprintf (&cd, "enum %s", name);
+		    break;
+		  default:
+		    ctf_set_errno (fp, ECTF_CORRUPT);
+		    ctf_decl_fini (&cd);
+		    return NULL;
+		  }
+		break;
+	      }
 	    case CTF_K_VOLATILE:
 	      ctf_decl_sprintf (&cd, "volatile");
 	      break;


More information about the Binutils-cvs mailing list