Bug 27267 - Better support for opaque enum types

Message ID 87h7msf94s.fsf@redhat.com
State New
Headers
Series Bug 27267 - Better support for opaque enum types |

Commit Message

Dodji Seketeli Feb. 4, 2021, 9:57 a.m. UTC
  Hello,

Upon a request to build the IR for a opaque enum type,
get_opaque_version_of_type wrongly returns a nil type even though the
code is in there to construct an opaque variant of the enum.

This patch cleans up that code to let it build an opaque enum type.
It also ensures the opaque enum type is properly added to its lexical
scope to ensure proper life cycle management.

	* src/abg-dwarf-reader.cc (get_opaque_version_of_type): Do not
	quit early for enum types, because the code that comes a bit later
	can handle enums.  Add the newly built enum to its scope for
	proper life cycle management.
	* tests/data/test-diff-suppr/PR27267/include-dir-v{0,1}/include.h: New
	include files for the input test library.
	* tests/data/test-diff-suppr/PR27267/libtestpr27267-v{0,1}.so: New
	input test library.
	* tests/data/test-diff-suppr/PR27267/report-1.txt: New reference
	output for the comparison.
	* tests/data/test-diff-suppr/PR27267/v{0,1}.c: Source code for the
	new input test library.
	* tests/data/Makefile.am: Add the new test material above to
	source distribution.
	* tests/test-diff-suppr.cc (in_out_specs): Add the new test input
	above to the test harness.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
---
 src/abg-dwarf-reader.cc                       |   7 +----
 tests/data/Makefile.am                        |   7 +++++
 .../PR27267/include-dir-v0/include.h          |   8 +++++
 .../PR27267/include-dir-v1/include.h          |   8 +++++
 .../PR27267/libtestpr27267-v0.so              | Bin 0 -> 17376 bytes
 .../PR27267/libtestpr27267-v1.so              | Bin 0 -> 17400 bytes
 .../data/test-diff-suppr/PR27267/report-1.txt |   0
 tests/data/test-diff-suppr/PR27267/v0.c       |  25 ++++++++++++++++
 tests/data/test-diff-suppr/PR27267/v1.c       |  28 ++++++++++++++++++
 tests/test-diff-suppr.cc                      |  10 +++++++
 10 files changed, 87 insertions(+), 6 deletions(-)
 create mode 100644 tests/data/test-diff-suppr/PR27267/include-dir-v0/include.h
 create mode 100644 tests/data/test-diff-suppr/PR27267/include-dir-v1/include.h
 create mode 100755 tests/data/test-diff-suppr/PR27267/libtestpr27267-v0.so
 create mode 100755 tests/data/test-diff-suppr/PR27267/libtestpr27267-v1.so
 create mode 100644 tests/data/test-diff-suppr/PR27267/report-1.txt
 create mode 100644 tests/data/test-diff-suppr/PR27267/v0.c
 create mode 100644 tests/data/test-diff-suppr/PR27267/v1.c
  

Patch

diff --git a/src/abg-dwarf-reader.cc b/src/abg-dwarf-reader.cc
index 13f1fe61..13c81821 100644
--- a/src/abg-dwarf-reader.cc
+++ b/src/abg-dwarf-reader.cc
@@ -15906,12 +15906,6 @@  get_opaque_version_of_type(read_context	&ctxt,
       && tag != DW_TAG_enumeration_type)
     return result;
 
-  if (tag == DW_TAG_union_type)
-    // TODO: also handle declaration-only unions.  To do that, we mostly
-    // need to adapt add_or_update_union_type to make it schedule
-    // declaration-only unions for resolution too.
-    return result;
-
   string type_name, linkage_name;
   location type_location;
   die_loc_and_name(ctxt, type_die, type_location, type_name, linkage_name);
@@ -15973,6 +15967,7 @@  get_opaque_version_of_type(read_context	&ctxt,
 							    underlying_type,
 							    enumeratorz,
 							    linkage_name));
+	  add_decl_to_scope(enum_type, scope);
 	  result = enum_type;
 	}
     }
diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index 68ad902b..a427659d 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -1482,6 +1482,13 @@  test-diff-suppr/libtest48-soname-abixml-suppr.txt \
 test-diff-suppr/libtest48-soname-abixml-suppr-2.txt \
 test-diff-suppr/libtest48-soname-abixml-suppr-3.txt \
 test-diff-suppr/libtest48-soname-abixml-suppr-4.txt \
+test-diff-suppr/PR27267/include-dir-v0/include.h \
+test-diff-suppr/PR27267/include-dir-v1/include.h \
+test-diff-suppr/PR27267/v0.c \
+test-diff-suppr/PR27267/v1.c \
+test-diff-suppr/PR27267/libtestpr27267-v0.so \
+test-diff-suppr/PR27267/libtestpr27267-v1.so \
+test-diff-suppr/PR27267/report-1.txt \
 \
 test-diff-dwarf-abixml/test0-pr19026-libvtkIOSQL-6.1.so.1 \
 test-diff-dwarf-abixml/test0-pr19026-libvtkIOSQL-6.1.so.1.abi \
diff --git a/tests/data/test-diff-suppr/PR27267/include-dir-v0/include.h b/tests/data/test-diff-suppr/PR27267/include-dir-v0/include.h
new file mode 100644
index 00000000..0b915537
--- /dev/null
+++ b/tests/data/test-diff-suppr/PR27267/include-dir-v0/include.h
@@ -0,0 +1,8 @@ 
+enum opaque_enum;
+struct opaque_struct;
+
+typedef enum opaque_enum opaque_enum;
+typedef struct opaque_struct opaque_struct;
+
+void
+fn(opaque_struct *, opaque_enum *e);
diff --git a/tests/data/test-diff-suppr/PR27267/include-dir-v1/include.h b/tests/data/test-diff-suppr/PR27267/include-dir-v1/include.h
new file mode 100644
index 00000000..0b915537
--- /dev/null
+++ b/tests/data/test-diff-suppr/PR27267/include-dir-v1/include.h
@@ -0,0 +1,8 @@ 
+enum opaque_enum;
+struct opaque_struct;
+
+typedef enum opaque_enum opaque_enum;
+typedef struct opaque_struct opaque_struct;
+
+void
+fn(opaque_struct *, opaque_enum *e);
diff --git a/tests/data/test-diff-suppr/PR27267/libtestpr27267-v0.so b/tests/data/test-diff-suppr/PR27267/libtestpr27267-v0.so
new file mode 100755
index 0000000000000000000000000000000000000000..58df0022f6686c2f3ab34b284a30a91796eec4ec
GIT binary patch
literal 17376
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

literal 0
HcmV?d00001

diff --git a/tests/data/test-diff-suppr/PR27267/libtestpr27267-v1.so b/tests/data/test-diff-suppr/PR27267/libtestpr27267-v1.so
new file mode 100755
index 0000000000000000000000000000000000000000..fdf648a5c2494ffd99f87e88bf7e8b385e6ca794
GIT binary patch
literal 17400
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
A1poj5

literal 0
HcmV?d00001

diff --git a/tests/data/test-diff-suppr/PR27267/report-1.txt b/tests/data/test-diff-suppr/PR27267/report-1.txt
new file mode 100644
index 00000000..e69de29b
diff --git a/tests/data/test-diff-suppr/PR27267/v0.c b/tests/data/test-diff-suppr/PR27267/v0.c
new file mode 100644
index 00000000..74527dc0
--- /dev/null
+++ b/tests/data/test-diff-suppr/PR27267/v0.c
@@ -0,0 +1,25 @@ 
+/**
+ *
+ * Compile with:
+ *   gcc -shared -g -Wall -o libtestpr27267-v0.so v0.c
+ *
+ */
+
+#include "include-dir-v0/include.h"
+
+enum opaque_enum
+{
+  e0,
+  e1
+};
+
+struct opaque_struct
+{
+  opaque_enum m0;
+};
+
+void
+fn(opaque_struct * s, opaque_enum *e)
+{
+  s->m0 = *e;
+}
diff --git a/tests/data/test-diff-suppr/PR27267/v1.c b/tests/data/test-diff-suppr/PR27267/v1.c
new file mode 100644
index 00000000..c36d09ae
--- /dev/null
+++ b/tests/data/test-diff-suppr/PR27267/v1.c
@@ -0,0 +1,28 @@ 
+/**
+ *
+ * Compile with:
+ *   gcc -shared -g -Wall -o libtestpr27267-v1.so v1.c
+ *
+ */
+
+#include "include-dir-v1/include.h"
+
+enum opaque_enum
+{
+  e0,
+  e1,
+  e2
+};
+
+struct opaque_struct
+{
+  opaque_enum m0;
+  opaque_enum m1;
+};
+
+void
+fn(opaque_struct * s, opaque_enum *e)
+{
+  s->m0 = *e;
+  s->m1 = s->m0;
+}
diff --git a/tests/test-diff-suppr.cc b/tests/test-diff-suppr.cc
index c7b73fd6..5b4d08d3 100644
--- a/tests/test-diff-suppr.cc
+++ b/tests/test-diff-suppr.cc
@@ -2026,6 +2026,16 @@  InOutSpec in_out_specs[] =
     "data/test-diff-suppr/libtest48-soname-abixml-report-1.txt",
     "output/test-diff-suppr/libtest48-soname-abixml-report-1_suppr4.txt"
   },
+  {
+    "data/test-diff-suppr/PR27267/libtestpr27267-v0.so",
+    "data/test-diff-suppr/PR27267/libtestpr27267-v1.so",
+    "data/test-diff-suppr/PR27267/include-dir-v0",
+    "data/test-diff-suppr/PR27267/include-dir-v1",
+    "",
+    "--drop-private-types --no-default-suppression",
+    "data/test-diff-suppr/PR27267/report-1.txt",
+    "output/test-diff-suppr/PR27267/report-1.txt"
+  },
   // This should be the last entry
   {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}
 };