[PATCH] Move CapturedStmt parameters to CapturedDecl
Ben Langmuir
ben.langmuir at intel.com
Tue Apr 30 05:24:05 PDT 2013
Use an ASTContext-allocated array rather than a SmallVector.
Hi doug.gregor, wei.pan, rjmccall,
http://llvm-reviews.chandlerc.com/D722
CHANGE SINCE LAST DIFF
http://llvm-reviews.chandlerc.com/D722?vs=1763&id=1779#toc
Files:
include/clang/AST/Decl.h
include/clang/Sema/Sema.h
lib/AST/Decl.cpp
lib/CodeGen/CGStmt.cpp
lib/Parse/ParsePragma.cpp
lib/Sema/SemaStmt.cpp
Index: include/clang/AST/Decl.h
===================================================================
--- include/clang/AST/Decl.h
+++ include/clang/AST/Decl.h
@@ -3169,31 +3169,44 @@
/// DeclContext.
class CapturedDecl : public Decl, public DeclContext {
private:
+ /// \brief The number of parameters to the outlined function.
+ unsigned NumParams;
+ /// \brief The body of the outlined function.
Stmt *Body;
- SmallVector<ImplicitParamDecl *, 3> Params;
- explicit CapturedDecl(DeclContext *DC)
- : Decl(Captured, DC, SourceLocation()), DeclContext(Captured) { }
+ explicit CapturedDecl(DeclContext *DC, unsigned NumParams)
+ : Decl(Captured, DC, SourceLocation()), DeclContext(Captured),
+ NumParams(NumParams), Body(0) { }
+
+ ImplicitParamDecl **getParams() const {
+ return reinterpret_cast<ImplicitParamDecl **>(
+ const_cast<CapturedDecl *>(this) + 1);
+ }
public:
- static CapturedDecl *Create(ASTContext &C, DeclContext *DC);
+ static CapturedDecl *Create(ASTContext &C, DeclContext *DC, unsigned NumParams);
Stmt *getBody() const { return Body; }
void setBody(Stmt *B) { Body = B; }
- void setContextParam(ImplicitParamDecl *P) {
- assert(Params.size() == 0);
- Params.push_back(P);
+ ImplicitParamDecl *getParam(unsigned i) const {
+ assert(i < NumParams);
+ return getParams()[i];
}
- ImplicitParamDecl *getContextParam() const {
- assert(Params.size() > 0);
- return Params[0];
+ void setParam(unsigned i, ImplicitParamDecl *P) {
+ assert(i < NumParams);
+ getParams()[i] = P;
}
- void addParam(ImplicitParamDecl *P) { Params.push_back(P); }
- ImplicitParamDecl *getParam(unsigned i) const { return Params[i]; }
+ /// \brief Retrieve the parameter containing captured variables.
+ ImplicitParamDecl *getContextParam() const { return getParam(0); }
+ void setContextParam(ImplicitParamDecl *P) { setParam(0, P); }
- const SmallVectorImpl<ImplicitParamDecl *>& getParams() const { return Params; }
+ typedef ImplicitParamDecl **param_iterator;
+ /// \brief Retrieve an iterator pointing to the first parameter decl.
+ param_iterator param_begin() const { return getParams(); }
+ /// \brief Retrieve an iterator one past the last parameter decl.
+ param_iterator param_end() const { return getParams() + NumParams; }
// Implement isa/cast/dyncast/etc.
static bool classof(const Decl *D) { return classofKind(D->getKind()); }
Index: include/clang/Sema/Sema.h
===================================================================
--- include/clang/Sema/Sema.h
+++ include/clang/Sema/Sema.h
@@ -2783,11 +2783,12 @@
StmtResult ActOnBreakStmt(SourceLocation BreakLoc, Scope *CurScope);
void ActOnCapturedRegionStart(SourceLocation Loc, Scope *CurScope,
- CapturedRegionKind Kind);
+ CapturedRegionKind Kind, unsigned NumParams);
StmtResult ActOnCapturedRegionEnd(Stmt *S);
void ActOnCapturedRegionError(bool IsInstantiation = false);
RecordDecl *CreateCapturedStmtRecordDecl(CapturedDecl *&CD,
- SourceLocation Loc);
+ SourceLocation Loc,
+ unsigned NumParams);
const VarDecl *getCopyElisionCandidate(QualType ReturnType, Expr *E,
bool AllowFunctionParameters);
Index: lib/AST/Decl.cpp
===================================================================
--- lib/AST/Decl.cpp
+++ lib/AST/Decl.cpp
@@ -3239,8 +3239,10 @@
0, 0);
}
-CapturedDecl *CapturedDecl::Create(ASTContext &C, DeclContext *DC) {
- return new (C) CapturedDecl(DC);
+CapturedDecl *CapturedDecl::Create(ASTContext &C, DeclContext *DC,
+ unsigned NumParams) {
+ unsigned Size = sizeof(CapturedDecl) + NumParams *sizeof(ImplicitParamDecl*);
+ return new (C.Allocate(Size)) CapturedDecl(DC, NumParams);
}
EnumConstantDecl *EnumConstantDecl::Create(ASTContext &C, EnumDecl *CD,
Index: lib/CodeGen/CGStmt.cpp
===================================================================
--- lib/CodeGen/CGStmt.cpp
+++ lib/CodeGen/CGStmt.cpp
@@ -1808,7 +1808,7 @@
// Build the argument list.
ASTContext &Ctx = CGM.getContext();
FunctionArgList Args;
- Args.append(CD->getParams().begin(), CD->getParams().end());
+ Args.append(CD->param_begin(), CD->param_end());
// Create the function declaration.
FunctionType::ExtInfo ExtInfo;
Index: lib/Parse/ParsePragma.cpp
===================================================================
--- lib/Parse/ParsePragma.cpp
+++ lib/Parse/ParsePragma.cpp
@@ -136,7 +136,8 @@
SourceLocation Loc = Tok.getLocation();
ParseScope CapturedRegionScope(this, Scope::FnScope | Scope::DeclScope);
- Actions.ActOnCapturedRegionStart(Loc, getCurScope(), CR_Default);
+ Actions.ActOnCapturedRegionStart(Loc, getCurScope(), CR_Default,
+ /*NumParams=*/1);
StmtResult R = ParseCompoundStatement();
CapturedRegionScope.Exit();
Index: lib/Sema/SemaStmt.cpp
===================================================================
--- lib/Sema/SemaStmt.cpp
+++ lib/Sema/SemaStmt.cpp
@@ -2922,8 +2922,8 @@
}
RecordDecl*
-Sema::CreateCapturedStmtRecordDecl(CapturedDecl *&CD, SourceLocation Loc)
-{
+Sema::CreateCapturedStmtRecordDecl(CapturedDecl *&CD, SourceLocation Loc,
+ unsigned NumParams) {
DeclContext *DC = CurContext;
while (!(DC->isFunctionOrMethod() || DC->isRecord() || DC->isFileContext()))
DC = DC->getParent();
@@ -2938,10 +2938,11 @@
RD->setImplicit();
RD->startDefinition();
- CD = CapturedDecl::Create(Context, CurContext);
+ CD = CapturedDecl::Create(Context, CurContext, NumParams);
DC->addDecl(CD);
// Build the context parameter
+ assert(NumParams > 0 && "CapturedStmt requires context parameter");
DC = CapturedDecl::castToDeclContext(CD);
IdentifierInfo *VarName = &Context.Idents.get("__context");
QualType ParamType = Context.getPointerType(Context.getTagDeclType(RD));
@@ -2980,9 +2981,9 @@
}
void Sema::ActOnCapturedRegionStart(SourceLocation Loc, Scope *CurScope,
- CapturedRegionKind Kind) {
+ CapturedRegionKind Kind, unsigned NumParams) {
CapturedDecl *CD = 0;
- RecordDecl *RD = CreateCapturedStmtRecordDecl(CD, Loc);
+ RecordDecl *RD = CreateCapturedStmtRecordDecl(CD, Loc, NumParams);
// Enter the capturing scope for this captured region.
PushCapturedRegionScope(CurScope, CD, RD, Kind);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D722.2.patch
Type: text/x-patch
Size: 6671 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130430/79500b3c/attachment.bin>
More information about the cfe-commits
mailing list