[clang][IFS] Prevent Clang-IFS from Leaking symbols from inside a block.

Built libdispatch with clang interface stubs. Ran into some block
related issues. Basically VarDecl symbols can leak out because I wasn't
checking the case where a VarDecl is contained inside a BlockDecl
(versus a method or function).

This patch checks that a VarDecl is not a child decl of a BlockDecl.
This patch also does something very similar for c++ lambdas as well.

Differential Revision: https://reviews.llvm.org/D71301
This commit is contained in:
Puyan Lotfi
2020-01-13 15:22:08 -05:00
parent b7526cc21c
commit bd8c8827d9
3 changed files with 23 additions and 0 deletions

View File

@@ -53,6 +53,10 @@ class InterfaceStubFunctionsConsumer : public ASTConsumer {
return true;
if (const VarDecl *VD = dyn_cast<VarDecl>(ND)) {
if (const auto *Parent = VD->getParentFunctionOrMethod())
if (isa<BlockDecl>(Parent) || isa<CXXMethodDecl>(Parent))
return true;
if ((VD->getStorageClass() == StorageClass::SC_Extern) ||
(VD->getStorageClass() == StorageClass::SC_Static &&
VD->getParentFunctionOrMethod() == nullptr))

View File

@@ -0,0 +1,9 @@
// RUN: %clang_cc1 -emit-interface-stubs -fblocks -o - %s | FileCheck %s
// CHECK: --- !experimental-ifs-v1
// CHECK-NEXT: IfsVersion: 1.0
// CHECK-NEXT: Triple:
// CHECK-NEXT: ObjectFileFormat: ELF
// CHECK-NEXT: Symbols:
// CHECK-NEXT: ...
static void (^f)(void*) = ^(void* data) { int i; };

View File

@@ -0,0 +1,10 @@
// RUN: %clang_cc1 -emit-interface-stubs -o - %s | FileCheck %s
// CHECK: --- !experimental-ifs-v1
// CHECK-NEXT: IfsVersion: 1.0
// CHECK-NEXT: Triple:
// CHECK-NEXT: ObjectFileFormat: ELF
// CHECK-NEXT: Symbols:
// CHECK-NEXT: "f" : { Type: Object, Size: 1 }
// CHECK-NEXT: ...
auto f = [](void* data) { int i; };