plotfi created this revision.
plotfi added a reviewer: compnerd.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

This patch adds support for more decl types that need to be processable, as 
part of clang-ifs hardening.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D69995

Files:
  clang/lib/Frontend/InterfaceStubFunctionsConsumer.cpp
  clang/test/InterfaceStubs/class-template-partial-specialization.cpp
  clang/test/InterfaceStubs/cxx-conversion.cpp
  clang/test/InterfaceStubs/indirect-field-decl.cpp
  clang/test/InterfaceStubs/namespace.cpp
  clang/test/InterfaceStubs/non-type-template-parm-decl.cpp
  clang/test/InterfaceStubs/template-constexpr.cpp
  clang/test/InterfaceStubs/template-template-parm-decl.cpp
  clang/test/InterfaceStubs/trycatch.cpp
  clang/test/InterfaceStubs/usings.cpp
  clang/test/InterfaceStubs/var-template-specialization-decl.cpp

Index: clang/test/InterfaceStubs/var-template-specialization-decl.cpp
===================================================================
--- /dev/null
+++ clang/test/InterfaceStubs/var-template-specialization-decl.cpp
@@ -0,0 +1,17 @@
+// REQUIRES: x86-registered-target
+// RUN: %clang -target x86_64-unknown-linux-gnu -c -o - -emit-interface-stubs %s | FileCheck %s
+
+// CHECK:      --- !experimental-ifs-v1
+// CHECK-NEXT: IfsVersion: 1.0
+// CHECK-NEXT: Triple: x86_64-unknown-linux-gnu
+// CHECK-NEXT: ObjectFileFormat: ELF
+// CHECK-NEXT: Symbols:
+// CHECK-NEXT: "a" : { Type: Object, Size: 4 }
+// CHECK-NEXT: ...
+
+template<typename T, T v> struct S9 {
+    static constexpr T value = v;
+};
+template<typename T> struct S0 : public S9<bool, true> { };
+template<typename T> constexpr bool CE2 = S0<T>::value;
+int a = CE2<int>;
\ No newline at end of file
Index: clang/test/InterfaceStubs/usings.cpp
===================================================================
--- /dev/null
+++ clang/test/InterfaceStubs/usings.cpp
@@ -0,0 +1,17 @@
+// RUN: %clang -c -o - -emit-interface-stubs %s | FileCheck %s
+
+// CHECK:      --- !experimental-ifs-v1
+// CHECK-NEXT: IfsVersion: 1.0
+// CHECK-NEXT: Triple: x86_64-unknown-linux-gnu
+// CHECK-NEXT: ObjectFileFormat: ELF
+// CHECK-NEXT: Symbols:
+// CHECK-NEXT: ...
+
+template<typename T> struct S2 { static unsigned f(); };
+template<typename T> struct S3  { using S2<T>::f; };
+
+typedef struct {} S4;
+using ::S4;
+
+template<typename T, T t> struct C3{};
+template<bool b> using U1 = C3<bool, b>;
\ No newline at end of file
Index: clang/test/InterfaceStubs/trycatch.cpp
===================================================================
--- /dev/null
+++ clang/test/InterfaceStubs/trycatch.cpp
@@ -0,0 +1,15 @@
+// REQUIRES: x86-registered-target
+
+// RUN: %clang -target x86_64-unknown-linux-gnu -c -o - -emit-interface-stubs %s | FileCheck %s
+
+
+// CHECK:      --- !experimental-ifs-v1
+// CHECK-NEXT: IfsVersion: 1.0
+// CHECK-NEXT: Triple: x86_64-unknown-linux-gnu
+// CHECK-NEXT: ObjectFileFormat: ELF
+// CHECK-NEXT: Symbols:
+// CHECK-NEXT: "_Z1fv" : { Type: Func }
+// CHECK-NEXT: ...
+
+class C5 {};
+void f() { try {} catch(C5&){} }
\ No newline at end of file
Index: clang/test/InterfaceStubs/template-template-parm-decl.cpp
===================================================================
--- /dev/null
+++ clang/test/InterfaceStubs/template-template-parm-decl.cpp
@@ -0,0 +1,10 @@
+// RUN: %clang -c -o - -emit-interface-stubs %s | FileCheck %s
+
+// CHECK:      --- !experimental-ifs-v1
+// CHECK-NEXT: IfsVersion: 1.0
+// CHECK-NEXT: Triple: x86_64-unknown-linux-gnu
+// CHECK-NEXT: ObjectFileFormat: ELF
+// CHECK-NEXT: Symbols:
+// CHECK-NEXT: ...
+
+template<template<typename...> class a> struct S6 { };
\ No newline at end of file
Index: clang/test/InterfaceStubs/template-constexpr.cpp
===================================================================
--- /dev/null
+++ clang/test/InterfaceStubs/template-constexpr.cpp
@@ -0,0 +1,11 @@
+// RUN: %clang -c -o - -emit-interface-stubs %s | FileCheck %s
+
+// CHECK:      --- !experimental-ifs-v1
+// CHECK-NEXT: IfsVersion: 1.0
+// CHECK-NEXT: Triple: x86_64-unknown-linux-gnu
+// CHECK-NEXT: ObjectFileFormat: ELF
+// CHECK-NEXT: Symbols:
+// CHECK-NEXT: ...
+
+template<typename T, T v> struct S8 { static constexpr T value = v; };
+template<typename T, T v> constexpr T S8<T, v>::value;
\ No newline at end of file
Index: clang/test/InterfaceStubs/non-type-template-parm-decl.cpp
===================================================================
--- /dev/null
+++ clang/test/InterfaceStubs/non-type-template-parm-decl.cpp
@@ -0,0 +1,10 @@
+// RUN: %clang -c -o - -emit-interface-stubs %s | FileCheck %s
+
+// CHECK:      --- !experimental-ifs-v1
+// CHECK-NEXT: IfsVersion: 1.0
+// CHECK-NEXT: Triple: x86_64-unknown-linux-gnu
+// CHECK-NEXT: ObjectFileFormat: ELF
+// CHECK-NEXT: Symbols:
+// CHECK-NEXT: ...
+
+template<bool T> struct S1 {};
\ No newline at end of file
Index: clang/test/InterfaceStubs/namespace.cpp
===================================================================
--- /dev/null
+++ clang/test/InterfaceStubs/namespace.cpp
@@ -0,0 +1,11 @@
+// RUN: %clang -c -o - -emit-interface-stubs %s | FileCheck %s
+
+// CHECK:      --- !experimental-ifs-v1
+// CHECK-NEXT: IfsVersion: 1.0
+// CHECK-NEXT: Triple: x86_64-unknown-linux-gnu
+// CHECK-NEXT: ObjectFileFormat: ELF
+// CHECK-NEXT: Symbols:
+// CHECK-NEXT: ...
+
+namespace NS1 { }
+using namespace NS1;
\ No newline at end of file
Index: clang/test/InterfaceStubs/indirect-field-decl.cpp
===================================================================
--- /dev/null
+++ clang/test/InterfaceStubs/indirect-field-decl.cpp
@@ -0,0 +1,10 @@
+// RUN: %clang -c -o - -emit-interface-stubs %s | FileCheck %s
+
+// CHECK:      --- !experimental-ifs-v1
+// CHECK-NEXT: IfsVersion: 1.0
+// CHECK-NEXT: Triple: x86_64-unknown-linux-gnu
+// CHECK-NEXT: ObjectFileFormat: ELF
+// CHECK-NEXT: Symbols:
+// CHECK-NEXT: ...
+
+template<typename T> class C2 { union { T c; }; };
\ No newline at end of file
Index: clang/test/InterfaceStubs/cxx-conversion.cpp
===================================================================
--- /dev/null
+++ clang/test/InterfaceStubs/cxx-conversion.cpp
@@ -0,0 +1,13 @@
+// RUN: %clang -c -o - -emit-interface-stubs %s | FileCheck %s
+
+// CHECK:      --- !experimental-ifs-v1
+// CHECK-NEXT: IfsVersion: 1.0
+// CHECK-NEXT: Triple: x86_64-unknown-linux-gnu
+// CHECK-NEXT: ObjectFileFormat: ELF
+// CHECK-NEXT: Symbols:
+// CHECK-NEXT: ...
+
+template<typename T> class C1 {
+    long a;
+    operator long() const { return a; }
+};
\ No newline at end of file
Index: clang/test/InterfaceStubs/class-template-partial-specialization.cpp
===================================================================
--- /dev/null
+++ clang/test/InterfaceStubs/class-template-partial-specialization.cpp
@@ -0,0 +1,11 @@
+// RUN: %clang -c -o - -emit-interface-stubs %s | FileCheck %s
+
+// CHECK:      --- !experimental-ifs-v1
+// CHECK-NEXT: IfsVersion: 1.0
+// CHECK-NEXT: Triple: x86_64-unknown-linux-gnu
+// CHECK-NEXT: ObjectFileFormat: ELF
+// CHECK-NEXT: Symbols:
+// CHECK-NEXT: ...
+
+template<typename> struct S7 { };
+template<typename T> struct S7<T&> { };
\ No newline at end of file
Index: clang/lib/Frontend/InterfaceStubFunctionsConsumer.cpp
===================================================================
--- clang/lib/Frontend/InterfaceStubFunctionsConsumer.cpp
+++ clang/lib/Frontend/InterfaceStubFunctionsConsumer.cpp
@@ -182,8 +182,30 @@
     case Decl::Kind::Enum:
     case Decl::Kind::EnumConstant:
     case Decl::Kind::TemplateTypeParm:
+    case Decl::Kind::NonTypeTemplateParm:
+    case Decl::Kind::CXXConversion:
+    case Decl::Kind::UnresolvedUsingValue:
+    case Decl::Kind::Using:
+    case Decl::Kind::UsingShadow:
+    case Decl::Kind::TypeAliasTemplate:
+    case Decl::Kind::TypeAlias:
+    case Decl::Kind::VarTemplate:
+    case Decl::Kind::VarTemplateSpecialization:
+    case Decl::Kind::UsingDirective:
+    case Decl::Kind::TemplateTemplateParm:
+    case Decl::Kind::ClassTemplatePartialSpecialization:
+    case Decl::Kind::IndirectField:
       return true;
-    case Decl::Kind::Var:
+    case Decl::Kind::Var: {
+      // Bail on any VarDecl that either has no named symbol or is a dependent
+      // or templated type.
+      if (cast<VarDecl>(ND)->getType()->isDependentType() ||
+          cast<VarDecl>(ND)->isTemplated() || !ND->getIdentifier())
+        return true;
+      if (WriteNamedDecl(ND, Symbols, RDO))
+        return true;
+      break;
+    }
     case Decl::Kind::ParmVar:
     case Decl::Kind::CXXMethod:
     case Decl::Kind::CXXConstructor:
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
  • [PATCH] D69995: [clang]... Puyan Lotfi via Phabricator via cfe-commits

Reply via email to