Skip to content

Commit

Permalink
Merged master:30507137986a into amd-gfx:4075ffb32ad6
Browse files Browse the repository at this point in the history
Local branch amd-gfx 4075ffb Merged master:47849870278c into amd-gfx:60ae67882921
Remote branch master 3050713 [Attributor] Provide an edge-based interface in AAIsDead
  • Loading branch information
Sw authored and Sw committed Aug 26, 2020
2 parents 4075ffb + 3050713 commit 67f09f7
Show file tree
Hide file tree
Showing 21 changed files with 969 additions and 187 deletions.
37 changes: 36 additions & 1 deletion clang/include/clang/Tooling/Syntax/Nodes.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ enum class NodeKind : uint16_t {
IdExpression,
MemberExpression,
ThisExpression,
CallExpression,

// Statements.
UnknownStatement,
Expand Down Expand Up @@ -103,7 +104,8 @@ enum class NodeKind : uint16_t {
GlobalNameSpecifier,
DecltypeNameSpecifier,
IdentifierNameSpecifier,
SimpleTemplateNameSpecifier
SimpleTemplateNameSpecifier,
CallArguments
};
/// For debugging purposes.
raw_ostream &operator<<(raw_ostream &OS, NodeKind K);
Expand Down Expand Up @@ -179,6 +181,8 @@ enum class NodeRole : uint8_t {
MemberExpression_object,
MemberExpression_accessToken,
MemberExpression_member,
CallExpression_callee,
CallExpression_arguments,
};
/// For debugging purposes.
raw_ostream &operator<<(raw_ostream &OS, NodeRole R);
Expand Down Expand Up @@ -324,6 +328,37 @@ class ThisExpression final : public Expression {
Leaf *thisKeyword();
};

/// Models arguments of a function call.
/// call-arguments:
/// delimited_list(expression, ',')
/// Note: This construct is a simplification of the grammar rule for
/// `expression-list`, that is used in the definition of `call-expression`
class CallArguments final : public List {
public:
CallArguments() : List(NodeKind::CallArguments) {}
static bool classof(const Node *N) {
return N->kind() <= NodeKind::CallArguments;
}
std::vector<Expression *> arguments();
std::vector<List::ElementAndDelimiter<Expression>> argumentsAndCommas();
};

/// A function call. C++ [expr.call]
/// call-expression:
/// expression '(' call-arguments ')'
/// e.g `f(1, '2')` or `this->Base::f()`
class CallExpression final : public Expression {
public:
CallExpression() : Expression(NodeKind::CallExpression) {}
static bool classof(const Node *N) {
return N->kind() == NodeKind::CallExpression;
}
Expression *callee();
Leaf *openParen();
CallArguments *arguments();
Leaf *closeParen();
};

/// Models a parenthesized expression `(E)`. C++ [expr.prim.paren]
/// e.g. `(3 + 2)` in `a = 1 + (3 + 2);`
class ParenExpression final : public Expression {
Expand Down
66 changes: 64 additions & 2 deletions clang/lib/Tooling/Syntax/BuildTree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -184,10 +184,11 @@ static syntax::NodeKind getOperatorNodeKind(const CXXOperatorCallExpr &E) {
case OO_Array_New:
case OO_Array_Delete:
case OO_Coawait:
case OO_Call:
case OO_Subscript:
case OO_Arrow:
return syntax::NodeKind::UnknownExpression;
case OO_Call:
return syntax::NodeKind::CallExpression;
case OO_Conditional: // not overloadable
case NUM_OVERLOADED_OPERATORS:
case OO_None:
Expand Down Expand Up @@ -1042,6 +1043,46 @@ class BuildTreeVisitor : public RecursiveASTVisitor<BuildTreeVisitor> {
return true;
}

syntax::CallArguments *buildCallArguments(CallExpr::arg_range Args) {
for (const auto &Arg : Args) {
Builder.markExprChild(Arg, syntax::NodeRole::List_element);
const auto *DelimiterToken =
std::next(Builder.findToken(Arg->getEndLoc()));
if (DelimiterToken->kind() == clang::tok::TokenKind::comma)
Builder.markChildToken(DelimiterToken,
syntax::NodeRole::List_delimiter);
}

auto *Arguments = new (allocator()) syntax::CallArguments;
if (!Args.empty())
Builder.foldNode(Builder.getRange((*Args.begin())->getBeginLoc(),
(*(Args.end() - 1))->getEndLoc()),
Arguments, nullptr);

return Arguments;
}

bool WalkUpFromCallExpr(CallExpr *S) {
Builder.markExprChild(S->getCallee(),
syntax::NodeRole::CallExpression_callee);

const auto *LParenToken =
std::next(Builder.findToken(S->getCallee()->getEndLoc()));
// FIXME: Assert that `LParenToken` is indeed a `l_paren` once we have fixed
// the test on decltype desctructors.
if (LParenToken->kind() == clang::tok::l_paren)
Builder.markChildToken(LParenToken, syntax::NodeRole::OpenParen);

Builder.markChild(buildCallArguments(S->arguments()),
syntax::NodeRole::CallExpression_arguments);

Builder.markChildToken(S->getRParenLoc(), syntax::NodeRole::CloseParen);

Builder.foldNode(Builder.getRange(S->getSourceRange()),
new (allocator()) syntax::CallExpression, S);
return true;
}

bool TraverseCXXOperatorCallExpr(CXXOperatorCallExpr *S) {
// To construct a syntax tree of the same shape for calls to built-in and
// user-defined operators, ignore the `DeclRefExpr` that refers to the
Expand Down Expand Up @@ -1100,8 +1141,29 @@ class BuildTreeVisitor : public RecursiveASTVisitor<BuildTreeVisitor> {
new (allocator()) syntax::PostfixUnaryOperatorExpression,
S);
return true;
case syntax::NodeKind::CallExpression: {
Builder.markExprChild(S->getArg(0),
syntax::NodeRole::CallExpression_callee);

const auto *LParenToken =
std::next(Builder.findToken(S->getArg(0)->getEndLoc()));
// FIXME: Assert that `LParenToken` is indeed a `l_paren` once we have
// fixed the test on decltype desctructors.
if (LParenToken->kind() == clang::tok::l_paren)
Builder.markChildToken(LParenToken, syntax::NodeRole::OpenParen);

Builder.markChild(buildCallArguments(CallExpr::arg_range(
S->arg_begin() + 1, S->arg_end())),
syntax::NodeRole::CallExpression_arguments);

Builder.markChildToken(S->getRParenLoc(), syntax::NodeRole::CloseParen);

Builder.foldNode(Builder.getRange(S->getSourceRange()),
new (allocator()) syntax::CallExpression, S);
return true;
}
case syntax::NodeKind::UnknownExpression:
return RecursiveASTVisitor::WalkUpFromCXXOperatorCallExpr(S);
return WalkUpFromExpr(S);
default:
llvm_unreachable("getOperatorNodeKind() does not return this value");
}
Expand Down
47 changes: 47 additions & 0 deletions clang/lib/Tooling/Syntax/Nodes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ raw_ostream &syntax::operator<<(raw_ostream &OS, NodeKind K) {
return OS << "UnqualifiedId";
case NodeKind::IdExpression:
return OS << "IdExpression";
case NodeKind::CallExpression:
return OS << "CallExpression";
case NodeKind::UnknownStatement:
return OS << "UnknownStatement";
case NodeKind::DeclarationStatement:
Expand Down Expand Up @@ -130,6 +132,8 @@ raw_ostream &syntax::operator<<(raw_ostream &OS, NodeKind K) {
return OS << "NestedNameSpecifier";
case NodeKind::MemberExpression:
return OS << "MemberExpression";
case NodeKind::CallArguments:
return OS << "CallArguments";
}
llvm_unreachable("unknown node kind");
}
Expand Down Expand Up @@ -212,6 +216,10 @@ raw_ostream &syntax::operator<<(raw_ostream &OS, NodeRole R) {
return OS << "MemberExpression_accessToken";
case syntax::NodeRole::MemberExpression_member:
return OS << "MemberExpression_member";
case syntax::NodeRole::CallExpression_callee:
return OS << "CallExpression_callee";
case syntax::NodeRole::CallExpression_arguments:
return OS << "CallExpression_arguments";
}
llvm_unreachable("invalid role");
}
Expand Down Expand Up @@ -240,6 +248,27 @@ syntax::NestedNameSpecifier::specifiersAndDoubleColons() {
return Children;
}

std::vector<syntax::Expression *> syntax::CallArguments::arguments() {
auto ArgumentsAsNodes = getElementsAsNodes();
std::vector<syntax::Expression *> Children;
for (const auto &ArgumentAsNode : ArgumentsAsNodes) {
Children.push_back(llvm::cast<syntax::Expression>(ArgumentAsNode));
}
return Children;
}

std::vector<syntax::List::ElementAndDelimiter<syntax::Expression>>
syntax::CallArguments::argumentsAndCommas() {
auto ArgumentsAsNodesAndCommas = getElementsAsNodesAndDelimiters();
std::vector<syntax::List::ElementAndDelimiter<syntax::Expression>> Children;
for (const auto &ArgumentAsNodeAndComma : ArgumentsAsNodesAndCommas) {
Children.push_back(
{llvm::cast<syntax::Expression>(ArgumentAsNodeAndComma.element),
ArgumentAsNodeAndComma.delimiter});
}
return Children;
}

syntax::Expression *syntax::MemberExpression::object() {
return cast_or_null<syntax::Expression>(
findChild(syntax::NodeRole::MemberExpression_object));
Expand Down Expand Up @@ -322,6 +351,24 @@ syntax::Expression *syntax::BinaryOperatorExpression::rhs() {
findChild(syntax::NodeRole::BinaryOperatorExpression_rightHandSide));
}

syntax::Expression *syntax::CallExpression::callee() {
return cast_or_null<syntax::Expression>(
findChild(syntax::NodeRole::CallExpression_callee));
}

syntax::Leaf *syntax::CallExpression::openParen() {
return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OpenParen));
}

syntax::CallArguments *syntax::CallExpression::arguments() {
return cast_or_null<syntax::CallArguments>(
findChild(syntax::NodeRole::CallExpression_arguments));
}

syntax::Leaf *syntax::CallExpression::closeParen() {
return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::CloseParen));
}

syntax::Leaf *syntax::SwitchStatement::switchKeyword() {
return cast_or_null<syntax::Leaf>(
findChild(syntax::NodeRole::IntroducerKeyword));
Expand Down
Loading

0 comments on commit 67f09f7

Please sign in to comment.