Skip to content

Commit

Permalink
Merged master:01e8dd2e7a8 into amd-gfx:148e72f8974
Browse files Browse the repository at this point in the history
Local branch amd-gfx 148e72f Merged master:80cd6b6e043 into amd-gfx:28ca29a47cf
Remote branch master 01e8dd2 [libTooling] Add stencil combinators for nodes that may be pointers or values.
  • Loading branch information
Sw authored and Sw committed Nov 22, 2019
2 parents 148e72f + 01e8dd2 commit bb5eee3
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 4 deletions.
13 changes: 13 additions & 0 deletions clang/include/clang/Tooling/Transformer/Stencil.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,11 +87,24 @@ Stencil expression(llvm::StringRef Id);
/// \p ExprId is wrapped in parentheses, if needed.
Stencil deref(llvm::StringRef ExprId);

/// If \p ExprId is of pointer type, constructs an idiomatic dereferencing of
/// the expression bound to \p ExprId, including wrapping it in parentheses, if
/// needed. Otherwise, generates the original expression source.
/// FIXME: Identify smart-pointers as pointer types.
Stencil maybeDeref(llvm::StringRef ExprId);

/// Constructs an expression that idiomatically takes the address of the
/// expression bound to \p ExprId. \p ExprId is wrapped in parentheses, if
/// needed.
Stencil addressOf(llvm::StringRef ExprId);

/// If \p ExprId is not a pointer type, constructs an expression that
/// idiomatically takes the address of the expression bound to \p ExprId,
/// including wrapping \p ExprId in parentheses, if needed. Otherwise, generates
/// the original expression source.
/// FIXME: Identify smart-pointers as pointer types.
Stencil maybeAddressOf(llvm::StringRef ExprId);

/// Constructs a `MemberExpr` that accesses the named member (\p Member) of the
/// object bound to \p BaseId. The access is constructed idiomatically: if \p
/// BaseId is bound to `e` and \p Member identifies member `m`, then returns
Expand Down
40 changes: 36 additions & 4 deletions clang/lib/Tooling/Transformer/Stencil.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,9 @@ struct DebugPrintNodeData {
enum class UnaryNodeOperator {
Parens,
Deref,
Address,
MaybeDeref,
AddressOf,
MaybeAddressOf,
};

// Generic container for stencil operations with a (single) node-id argument.
Expand Down Expand Up @@ -121,9 +123,15 @@ std::string toStringData(const UnaryOperationData &Data) {
case UnaryNodeOperator::Deref:
OpName = "deref";
break;
case UnaryNodeOperator::Address:
case UnaryNodeOperator::MaybeDeref:
OpName = "maybeDeref";
break;
case UnaryNodeOperator::AddressOf:
OpName = "addressOf";
break;
case UnaryNodeOperator::MaybeAddressOf:
OpName = "maybeAddressOf";
break;
}
return (OpName + "(\"" + Data.Id + "\")").str();
}
Expand Down Expand Up @@ -191,7 +199,21 @@ Error evalData(const UnaryOperationData &Data,
case UnaryNodeOperator::Deref:
Source = tooling::buildDereference(*E, *Match.Context);
break;
case UnaryNodeOperator::Address:
case UnaryNodeOperator::MaybeDeref:
if (!E->getType()->isAnyPointerType()) {
*Result += tooling::getText(*E, *Match.Context);
return Error::success();
}
Source = tooling::buildDereference(*E, *Match.Context);
break;
case UnaryNodeOperator::AddressOf:
Source = tooling::buildAddressOf(*E, *Match.Context);
break;
case UnaryNodeOperator::MaybeAddressOf:
if (E->getType()->isAnyPointerType()) {
*Result += tooling::getText(*E, *Match.Context);
return Error::success();
}
Source = tooling::buildAddressOf(*E, *Match.Context);
break;
}
Expand Down Expand Up @@ -300,9 +322,19 @@ Stencil transformer::deref(llvm::StringRef ExprId) {
UnaryNodeOperator::Deref, ExprId);
}

Stencil transformer::maybeDeref(llvm::StringRef ExprId) {
return std::make_shared<StencilImpl<UnaryOperationData>>(
UnaryNodeOperator::MaybeDeref, ExprId);
}

Stencil transformer::addressOf(llvm::StringRef ExprId) {
return std::make_shared<StencilImpl<UnaryOperationData>>(
UnaryNodeOperator::Address, ExprId);
UnaryNodeOperator::AddressOf, ExprId);
}

Stencil transformer::maybeAddressOf(llvm::StringRef ExprId) {
return std::make_shared<StencilImpl<UnaryOperationData>>(
UnaryNodeOperator::MaybeAddressOf, ExprId);
}

Stencil transformer::access(StringRef BaseId, Stencil Member) {
Expand Down
40 changes: 40 additions & 0 deletions clang/unittests/Tooling/StencilTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,46 @@ TEST_F(StencilTest, AddressOfDerefExpr) {
testExpr(Id, "int *x; *x;", addressOf(Id), "x");
}

TEST_F(StencilTest, MaybeDerefValue) {
StringRef Id = "id";
testExpr(Id, "int x; x;", maybeDeref(Id), "x");
}

TEST_F(StencilTest, MaybeDerefPointer) {
StringRef Id = "id";
testExpr(Id, "int *x; x;", maybeDeref(Id), "*x");
}

TEST_F(StencilTest, MaybeDerefBinOp) {
StringRef Id = "id";
testExpr(Id, "int *x; x + 1;", maybeDeref(Id), "*(x + 1)");
}

TEST_F(StencilTest, MaybeDerefAddressExpr) {
StringRef Id = "id";
testExpr(Id, "int x; &x;", maybeDeref(Id), "x");
}

TEST_F(StencilTest, MaybeAddressOfPointer) {
StringRef Id = "id";
testExpr(Id, "int *x; x;", maybeAddressOf(Id), "x");
}

TEST_F(StencilTest, MaybeAddressOfValue) {
StringRef Id = "id";
testExpr(Id, "int x; x;", addressOf(Id), "&x");
}

TEST_F(StencilTest, MaybeAddressOfBinOp) {
StringRef Id = "id";
testExpr(Id, "int x; x + 1;", maybeAddressOf(Id), "&(x + 1)");
}

TEST_F(StencilTest, MaybeAddressOfDerefExpr) {
StringRef Id = "id";
testExpr(Id, "int *x; *x;", addressOf(Id), "x");
}

TEST_F(StencilTest, AccessOpValue) {
StringRef Snippet = R"cc(
S x;
Expand Down

0 comments on commit bb5eee3

Please sign in to comment.