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