annotate clang/lib/Parse/ParseCbC.cpp @ 152:e8a9b4f4d755

pull from 146
author anatofuz
date Wed, 11 Mar 2020 18:29:16 +0900
parents tools/clang/lib/Parse/ParseCbC.cpp@53f12981605a
children 70c77e05b61e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
43
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
1 #ifndef noCbC
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
2
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 #include "clang/Parse/Parser.h"
126
mir3636
parents: 108
diff changeset
4 #include "clang/Parse/RAIIObjectsForParser.h"
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 #include "clang/AST/ASTContext.h"
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 #include "clang/Basic/PrettyStackTrace.h"
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 #include "clang/Basic/TargetInfo.h"
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 #include "clang/Sema/DeclSpec.h"
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 #include "clang/Sema/PrettyDeclStackTrace.h"
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 #include "clang/Sema/Scope.h"
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 #include "clang/Sema/Lookup.h"
44
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
12 #include "clang/Lex/LiteralSupport.h"
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
13 #include "clang/AST/ASTConsumer.h"
103
76d4b0e44709 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 98
diff changeset
14 #include "clang/Sema/SemaDiagnostic.h"
43
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
15
44
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
16 #include <sstream>
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
17 #include <string>
44
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
18 #include "CbCHelper.h"
43
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
19
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 using namespace clang;
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
22 /// The class which belong to this namespace is from other files' namespace.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
23 /// Because those namespaces are unnamed namespaces, we can't access them.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
24 /// So create this namespace and copy classes from those namespaces.
42
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
25 namespace ExternalSpace { // from ParseExpr.cpp , ParseStmt.cpp
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
26 class CastExpressionIdValidator : public CorrectionCandidateCallback {
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
27 public:
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
28 CastExpressionIdValidator(bool AllowTypes, bool AllowNonTypes)
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 : AllowNonTypes(AllowNonTypes) {
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
30 WantTypeSpecifiers = AllowTypes;
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
31 }
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
33 virtual bool ValidateCandidate(const TypoCorrection &candidate) {
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
34 NamedDecl *ND = candidate.getCorrectionDecl();
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
35 if (!ND)
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
36 return candidate.isKeyword();
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
38 if (isa<TypeDecl>(ND))
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
39 return WantTypeSpecifiers;
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
40 return AllowNonTypes;
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
41 }
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
43 private:
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
44 bool AllowNonTypes;
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
45 };
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
47 class StatementFilterCCC : public CorrectionCandidateCallback {
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
48 public:
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
49 StatementFilterCCC(Token nextTok) : NextToken(nextTok) {
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
50 WantTypeSpecifiers = nextTok.is(tok::l_paren) || nextTok.is(tok::less) ||
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
51 nextTok.is(tok::identifier) || nextTok.is(tok::star) ||
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
52 nextTok.is(tok::amp) || nextTok.is(tok::l_square);
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
53 WantExpressionKeywords = nextTok.is(tok::l_paren) ||
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
54 nextTok.is(tok::identifier) ||
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
55 nextTok.is(tok::arrow) || nextTok.is(tok::period);
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
56 WantRemainingKeywords = nextTok.is(tok::l_paren) || nextTok.is(tok::semi) ||
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
57 nextTok.is(tok::identifier) ||
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
58 nextTok.is(tok::l_brace);
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
59 WantCXXNamedCasts = false;
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
60 }
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
62 virtual bool ValidateCandidate(const TypoCorrection &candidate) {
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
63 if (FieldDecl *FD = candidate.getCorrectionDeclAs<FieldDecl>())
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
64 return !candidate.getCorrectionSpecifier() || isa<ObjCIvarDecl>(FD);
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
65 if (NextToken.is(tok::equal))
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
66 return candidate.getCorrectionDeclAs<VarDecl>();
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
67 if (NextToken.is(tok::period) &&
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
68 candidate.getCorrectionDeclAs<NamespaceDecl>())
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
69 return false;
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
70 return CorrectionCandidateCallback::ValidateCandidate(candidate);
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
71 }
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
73 private:
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
74 Token NextToken;
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
75 };
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 }
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
78
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
79 /// Prepare__retForGotoWithTheEnvExpr - Prepare __CbC_return, code segment for returning and some necessary statements.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
80 /// It is called when the parser find __return and statements are put into complex statement.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
81 ///
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
82 /// examples which are created:
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
83 /// complex statement:
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
84 /// ({
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
85 /// __code (*__CbC_return)(return_type, void*);
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
86 /// __CbC_return = code_segment_for_return;
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
87 /// __CbC_return;
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
88 /// });
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
89 /// code segment:
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
90 /// __code ret(return_type retval, void *env){
105
f9b011216f60 fix comment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 104
diff changeset
91 /// *(return_type)((struct __CbC_env *)(env))->ret_p = retval;
f9b011216f60 fix comment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 104
diff changeset
92 /// longjmp((int*)(((struct __CbC_env *)env)->env),1);
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
93 /// }
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
94 ExprResult Parser::Prepare__retForGotoWithTheEnvExpr(){
81
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
95
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
96 if (isVoidFunction()) { // error check : function type is void or not.
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
97 unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error, "continuation with the environment cannot use in the void function");
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
98 Diag(Tok, DiagID);
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
99 return ExprError();
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
100 }
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
101
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
102 StmtResult innerRes;
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
103 SourceLocation Loc = Tok.getLocation();
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
104 IdentifierInfo *__CbC_retII = CreateIdentifierInfo(__CBC_RETURN_NAME, Loc);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
105 IdentifierInfo *retcsII = CreateUniqueIdentifierInfo(__CBC_RET_CODE_BASE_NAME, Loc);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
106 Create__CbC_envStruct(Loc, AS_none);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
107
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
108 Actions.ActOnStartStmtExpr();
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
109 StmtResult CompoundStmtRes;
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
110 ParseScope CompoundScope(this, Scope::DeclScope);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
111 PrettyStackTraceLoc CrashInfo(PP.getSourceManager(),Loc,"in compound statement ('{}')");
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
112 StmtVector CompoundStmts;
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
113
60
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
114 // create code segment for return to C's function
81
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
115 CreateRetCS(retcsII);
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
116
60
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
117 // __code (*__CbC_return)();
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
118 innerRes = CreateDeclStmt(__CbC_retII, true, false, DeclSpec::TST___code);
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
119 if (innerRes.isUsable())
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
120 CompoundStmts.push_back(innerRes.get());
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
121
60
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
122 // __CbC_return = ret;
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
123 innerRes = CreateAssignmentStmt(__CbC_retII, retcsII);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
124 if (innerRes.isUsable())
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
125 CompoundStmts.push_back(innerRes.get());
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
126
60
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
127 // __CbC_return;
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
128 innerRes = CreateComplexStmtRet(__CbC_retII, false);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
129 if (innerRes.isUsable())
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
130 CompoundStmts.push_back(innerRes.get());
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
131
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
132 CompoundStmtRes = Actions.ActOnCompoundStmt(Loc,Loc,CompoundStmts,true);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
133 ConsumeToken(); // eat the '__return'.
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
134 return Actions.ActOnStmtExpr(Loc, CompoundStmtRes.get(), Loc);
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 }
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
136
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
137 /// Prepare__envForGotoWithTheEnvExpr - Prepare __CbC_environment, struct __CbC_env and some necessary statements.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
138 /// It is called when the parser find __environment and statements are put into complex statement.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
139 ///
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
140 /// examples which are created:
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
141 /// complex statement:
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
142 /// ({
106
596a38ee9c9e fix setjmp/longjmp with optimization bug (get some warnings)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 105
diff changeset
143 /// volatile struct __CbC_env __CbC_environment;
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
144 /// jmp_buf env_buf;
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
145 /// return_type retval;
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
146 /// __CbC_environment.ret_p = &retval;
104
929371e51940 add ParseCbC.cpp to CMakeLists.txt
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 103
diff changeset
147 /// __CbC_environment.env = &env_buf;
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
148 /// if (setjmp(__CbC_environment.env)){
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
149 /// return retval;
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
150 /// }
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
151 /// &__CbC_environment;
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
152 /// });
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
153 /// struct __CbC_env:
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
154 /// struct __CbC_env{
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
155 /// void *ret_p,*env;
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
156 /// }
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
157 ExprResult Parser::Prepare__envForGotoWithTheEnvExpr(){
81
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
158
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
159 if (isVoidFunction()) { // error check : function type is void or not.
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
160 unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error, "continuation with the environment cannot use in the void function");
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
161 Diag(Tok, DiagID);
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
162 return ExprError();
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
163 }
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
164
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
165 StmtResult innerRes;
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
166 SourceLocation Loc = Tok.getLocation();
64
0aa33659e8e4 modified Parser::CreateUniqueIdentifierInfo(). add unique id
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
167 IdentifierInfo *bufII = CreateIdentifierInfo(__CBC_BUF_NAME, Loc);
0aa33659e8e4 modified Parser::CreateUniqueIdentifierInfo(). add unique id
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
168 IdentifierInfo *retvalII = CreateIdentifierInfo(__CBC_RETVAL_NAME, Loc);
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
169 IdentifierInfo *structII = CreateIdentifierInfo(__CBC_STRUCT_NAME, Loc);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
170 IdentifierInfo *__CbC_envII = CreateIdentifierInfo(__CBC_ENVIRONMENT_NAME, Loc);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
171 IdentifierInfo *envII = CreateIdentifierInfo(__CBC_STRUCT_ENV_NAME, Loc);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
172 IdentifierInfo *ret_pII = CreateIdentifierInfo(__CBC_STRUCT_POINTER_NAME, Loc);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
173 Create__CbC_envStruct(Loc, AS_none);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
174 Actions.ActOnStartStmtExpr();
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
175 ParseScope CompoundScope(this, Scope::DeclScope);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
176 PrettyStackTraceLoc CrashInfo(PP.getSourceManager(),Loc,"in compound statement ('{}')");
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
177 StmtVector CompoundStmts;
107
a03ddd01be7e resolve warnings
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 106
diff changeset
178 ExprResult Result(true);
a03ddd01be7e resolve warnings
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 106
diff changeset
179
a03ddd01be7e resolve warnings
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 106
diff changeset
180 // struct __CbC_env __CbC_environment;
106
596a38ee9c9e fix setjmp/longjmp with optimization bug (get some warnings)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 105
diff changeset
181 innerRes = CreateDeclStmt(__CbC_envII, false, false, DeclSpec::TST_struct, structII, DeclSpec::TQ_volatile);
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
182 if (innerRes.isUsable())
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
183 CompoundStmts.push_back(innerRes.get());
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
184
60
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
185 // returnType retval;
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
186 innerRes = CreateDeclStmt(retvalII, false, true);
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
187 if (innerRes.isUsable())
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
188 CompoundStmts.push_back(innerRes.get());
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
189
60
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
190 // jmp_buf env_buf;
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
191 innerRes = CreateDeclStmt(bufII, false, false, DeclSpec::TST_typename, CreateIdentifierInfo("jmp_buf", Loc));
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
192 if (innerRes.isUsable())
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
193 CompoundStmts.push_back(innerRes.get());
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
194
60
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
195 // __CbC_environment.ret_p = &retval;
59
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
196 innerRes = CreateAssignmentStmt(__CbC_envII, retvalII, true, true, ret_pII);
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
197 if (innerRes.isUsable())
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
198 CompoundStmts.push_back(innerRes.get());
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
199
60
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
200 // __CbC_environment.env = env_buf;
59
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
201 innerRes = CreateAssignmentStmt(__CbC_envII, bufII, true, false, envII);
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
202 if (innerRes.isUsable())
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
203 CompoundStmts.push_back(innerRes.get());
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
204
60
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
205 // create statements of setjmp
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
206 innerRes = CreateSjForContinuationWithTheEnv();
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
207 if (innerRes.isUsable())
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
208 CompoundStmts.push_back(innerRes.get());
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
209
60
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
210 // __CbC_environment;
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
211 innerRes = CreateComplexStmtRet(__CbC_envII, true);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
212 if (innerRes.isUsable())
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
213 CompoundStmts.push_back(innerRes.get());
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
214
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
215 StmtResult CompoundStmtRes = Actions.ActOnCompoundStmt(Loc,Loc,CompoundStmts,true);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
216 ConsumeToken(); // eat the '__environment'.
107
a03ddd01be7e resolve warnings
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 106
diff changeset
217 Result = Actions.ActOnStmtExpr(Loc, CompoundStmtRes.get(), Loc);
a03ddd01be7e resolve warnings
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 106
diff changeset
218
a03ddd01be7e resolve warnings
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 106
diff changeset
219 // cast
a03ddd01be7e resolve warnings
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 106
diff changeset
220 ParsedType CastTy;
a03ddd01be7e resolve warnings
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 106
diff changeset
221 DeclSpec void_DS(AttrFactory);
a03ddd01be7e resolve warnings
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 106
diff changeset
222 setTST(&void_DS, DeclSpec::TST_void);
136
6cd7e602c98b Fix compile error to update llvm 5.0.1
mir3636
parents: 129
diff changeset
223 Declarator DeclaratorInfo(void_DS, DeclaratorContext::TypeNameContext);
107
a03ddd01be7e resolve warnings
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 106
diff changeset
224 DeclSpec star_DS(AttrFactory);
a03ddd01be7e resolve warnings
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 106
diff changeset
225 star_DS.Finish(Actions, Actions.getASTContext().getPrintingPolicy());
a03ddd01be7e resolve warnings
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 106
diff changeset
226 DeclaratorInfo.ExtendWithDeclSpec(star_DS);
a03ddd01be7e resolve warnings
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 106
diff changeset
227 DeclaratorInfo.SetIdentifier(nullptr, Tok.getLocation());
a03ddd01be7e resolve warnings
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 106
diff changeset
228 DeclaratorInfo.AddTypeInfo(DeclaratorChunk::getPointer(star_DS.getTypeQualifiers(), Loc,star_DS.getConstSpecLoc(),star_DS.getVolatileSpecLoc(),
128
mir3636
parents: 126
diff changeset
229 star_DS.getRestrictSpecLoc(),star_DS.getAtomicSpecLoc(),star_DS.getUnalignedSpecLoc()),star_DS.getAttributes(),SourceLocation());
107
a03ddd01be7e resolve warnings
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 106
diff changeset
230 return Actions.ActOnCastExpr(getCurScope(), Loc, DeclaratorInfo, CastTy,Loc, Result.get());
a03ddd01be7e resolve warnings
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 106
diff changeset
231
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
232 }
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
233
59
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
234 /// CreateAssignmentStmt - Create assignment statement such as "aaa = bbb;", "auaua = llll;", etc.
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
235 /// It can create 4 kinds of statement.
59
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
236 /// 1. common assignment statement:
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
237 /// variable '=' variable ';'
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
238 /// 2. LHS variable is member of struct:
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
239 /// structVar '.' member '=' variable ';'
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
240 /// 3. RHS variable is address of operand:
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
241 /// variable '=' '&' variable ';'
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
242 /// 4. 2+3:
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
243 /// structVar '.' member '=' '&' variable ';'
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
244 StmtResult Parser::CreateAssignmentStmt(IdentifierInfo* LHSII, IdentifierInfo* RHSII, bool LHSisMemberAccess, bool RHShasAmp,
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
245 IdentifierInfo* extraLHSII, IdentifierInfo* extraRHSII){
43
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
246 ExprResult Expr,LHS,RHS;
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
247
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
248 Token Next,LHSToken;
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
249 SourceLocation Loc = Tok.getLocation();
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
250 CXXScopeSpec SS;
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 Next.startToken();
43
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
252 Next.setKind(tok::period);
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
253 LHSToken.startToken();
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
254 LHSToken.setLocation(Loc);
43
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
255 LHSToken.setIdentifierInfo(LHSII);
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
256 LHSToken.setKind(tok::annot_primary_expr);
86
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
257 std::unique_ptr<ExternalSpace::StatementFilterCCC> Validator(new ExternalSpace::StatementFilterCCC(Next));
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
258 Sema::NameClassification Classification = Actions.ClassifyName(getCurScope(), SS, LHSII, Loc, Next, false, SS.isEmpty() ? std::move(Validator) : 0);
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
259 setExprAnnotation(LHSToken, Classification.getExpression());
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
260 LHSToken.setAnnotationEndLoc(Loc);
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
261 PP.AnnotateCachedTokens(LHSToken);
43
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
262
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
263 LHS = getExprAnnotation(LHSToken);
43
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
264
59
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
265 if (LHSisMemberAccess)
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
266 LHS = LookupMemberAndBuildExpr(extraLHSII, LHS.get(), false);
43
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
267
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
268 RHS = LookupNameAndBuildExpr(RHSII);
59
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
269 if (RHShasAmp)
43
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
270 RHS = Actions.ActOnUnaryOp(getCurScope(), Loc, tok::amp, RHS.get());
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
271
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
272 Expr = Actions.ActOnBinOp(getCurScope(), Loc,tok::equal,LHS.get(),RHS.get());
43
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
273
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
274 return Actions.ActOnExprStmt(Expr);
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
275 }
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
276
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
277 /// CreateDeclStmt - Create declaration statement such as "int aaa;".
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
278 /// If isRetCS is true, create code segment for return to C's function. And Name is name of code segment.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
279 /// If copyType is true, type of variable is copied from callee.
106
596a38ee9c9e fix setjmp/longjmp with optimization bug (get some warnings)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 105
diff changeset
280 StmtResult Parser::CreateDeclStmt(IdentifierInfo *II, bool isRetCS, bool copyType, DeclSpec::TST valueType, IdentifierInfo* Name, DeclSpec::TQ TQ){
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
281 const PrintingPolicy &Policy = Actions.getASTContext().getPrintingPolicy();
44
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
282 SourceLocation Loc = Tok.getLocation();
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
283 DeclGroupPtrTy DeclGPT;
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
284 ParsingDeclSpec DS(*this);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
285 DeclSpec *DSp;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
286 DSp = &DS;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
287
106
596a38ee9c9e fix setjmp/longjmp with optimization bug (get some warnings)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 105
diff changeset
288 setTST(&DS, valueType, Name, TQ);
136
6cd7e602c98b Fix compile error to update llvm 5.0.1
mir3636
parents: 129
diff changeset
289 ParsingDeclarator D(*this, DS, static_cast<DeclaratorContext>(DeclaratorContext::BlockContext));
44
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
290 D.SetIdentifier(II, Loc);
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
291
60
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
292 if (isRetCS) {
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
293 D.setEllipsisLoc(SourceLocation());
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
294 bool hadGroupingParens = D.hasGroupingParens();
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
295 D.setGroupingParens(true);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
296 D.SetRangeEnd(Loc);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
297 DeclSpec FDS(AttrFactory);
103
76d4b0e44709 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 98
diff changeset
298 DS.Finish(Actions, Policy);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
299
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
300 D.AddTypeInfo(DeclaratorChunk::getPointer(FDS.getTypeQualifiers(), Loc, FDS.getConstSpecLoc(), FDS.getVolatileSpecLoc(),
128
mir3636
parents: 126
diff changeset
301 FDS.getRestrictSpecLoc(), DS.getAtomicSpecLoc(), FDS.getUnalignedSpecLoc()), FDS.getAttributes(), SourceLocation());
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
302 D.setGroupingParens(hadGroupingParens);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
303
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
304
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
305 ParseScope PrototypeScope(this,Scope::FunctionPrototypeScope|Scope::DeclScope|
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
306 (D.isFunctionDeclaratorAFunctionDeclaration() ? Scope::FunctionDeclarationScope : 0));
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
307 bool HasProto = false;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
308 SmallVector<DeclaratorChunk::ParamInfo, 16> ParamInfo;
86
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
309 SourceLocation EllipsisLoc, RefQualifierLoc, ConstQualifierLoc, VolatileQualifierLoc, RestrictQualifierLoc;
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
310 DeclSpec FPDS(AttrFactory);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
311 bool RefQualifierIsLValueRef = true;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
312 ExceptionSpecificationType ESpecType = EST_None;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
313 SourceRange ESpecRange;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
314 SmallVector<ParsedType, 2> DynamicExceptions;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
315 SmallVector<SourceRange, 2> DynamicExceptionRanges;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
316 ExprResult NoexceptExpr;
86
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
317 CachedTokens *ExceptionSpecTokens = 0;
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
318 ParsedAttributes FnAttrs(AttrFactory);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
319 TypeResult TrailingReturnType;
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
320
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
321 ParmVarDecl *Param;
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
322 FunctionDecl *CurFunctionDecl = Actions.getCurFunctionDecl();
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
323 QualType CurFuncResQT = CurFunctionDecl->getReturnType();
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
324 TypeSourceInfo *CurFuncTI = Actions.Context.CreateTypeSourceInfo(CurFuncResQT);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
325
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
326 Param = CreateParam();
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
327 Param->setTypeSourceInfo(CurFuncTI);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
328 Param->setType(CurFuncResQT);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
329 ParamInfo.push_back(DeclaratorChunk::ParamInfo(0, Loc, Param, 0));
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
330 Param = CreateParam(0, 1, DeclSpec::TST_void);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
331 ParamInfo.push_back(DeclaratorChunk::ParamInfo(0, Loc, Param, 0));
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
332 HasProto = true;
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
333
86
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
334 D.AddTypeInfo(DeclaratorChunk::getFunction(HasProto, false, Loc, ParamInfo.data(),
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
335 ParamInfo.size(), EllipsisLoc, Loc, FPDS.getTypeQualifiers(),
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
336 RefQualifierIsLValueRef, RefQualifierLoc, ConstQualifierLoc,
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
337 VolatileQualifierLoc, RefQualifierLoc, SourceLocation(),
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
338 ESpecType, ESpecRange.getBegin(),
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
339 DynamicExceptions.data(), DynamicExceptionRanges.data(),
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
340 DynamicExceptions.size(),
128
mir3636
parents: 126
diff changeset
341 NoexceptExpr.isUsable() ? NoexceptExpr.get() : 0, ExceptionSpecTokens, None, Loc, Loc, D, TrailingReturnType),
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
342 FnAttrs, Loc);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
343 PrototypeScope.Exit();
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
344 DSp = &FDS;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
345 }
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
346
44
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
347 SmallVector<Decl *, 8> DeclsInGroup;
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
348 Decl *FirstDecl;
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
349
60
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
350 if (copyType)
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
351 FirstDecl = HandleDeclAndChangeDeclType(D);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
352 else
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
353 FirstDecl = ParseDeclarationAfterDeclaratorAndAttributes(D);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
354
44
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
355 D.complete(FirstDecl);
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
356 DeclsInGroup.push_back(FirstDecl);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
357 DeclGPT = Actions.FinalizeDeclaratorGroup(getCurScope(), *DSp, DeclsInGroup);
44
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
358 return Actions.ActOnDeclStmt(DeclGPT, Loc, Loc);
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
359 }
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
360
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
361
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
362 /// handleDeclAndChangeDeclType - This function imitated Parser::ParseDeclarationAfterDeclaratorAndAttributes() and Sema::ActOnDeclarator().
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
363 /// The origins get Type from Declarator but this function get Type from current function.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
364 /// It is useful for CbC to create statements for the continuation with the environments.
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
365 Decl* Parser::HandleDeclAndChangeDeclType(Declarator &D) {
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
366 D.setFunctionDefinitionKind(FDK_Declaration);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
367 DeclarationNameInfo NameInfo = Actions.GetNameForDeclarator(D);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
368 DeclContext *DC = Actions.CurContext;
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
369 QualType R = Actions.getCurFunctionDecl()->getReturnType(); // copy a type
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
370 TypeSourceInfo *TInfo = Actions.Context.CreateTypeSourceInfo(R); // copy a type infomation
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
371 Scope *S = getCurScope();
129
9ec641e857f8 Fix compile error to update llvm 5.0
mir3636
parents: 128
diff changeset
372 LookupResult Previous(Actions, NameInfo, Actions.LookupOrdinaryName, Actions.ForVisibleRedeclaration);
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
373 bool IsLinkageLookup = false;
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
374 bool CreateBuiltins = false;
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
375
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
376 // If the declaration we're planning to build will be a function
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
377 // or object with linkage, then look for another declaration with
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
378 // linkage (C99 6.2.2p4-5 and C++ [basic.link]p6).
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
379 //
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
380 // If the declaration we're planning to build will be declared with
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
381 // external linkage in the translation unit, create any builtin with
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
382 // the same name.
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
383 if (R->isFunctionType()) {
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
384 IsLinkageLookup = true;
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
385 CreateBuiltins =
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
386 Actions.CurContext->getEnclosingNamespaceContext()->isTranslationUnit();
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
387 } else if (Actions.CurContext->getRedeclContext()->isTranslationUnit())
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
388 CreateBuiltins = true;
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
389
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
390 if (IsLinkageLookup)
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
391 Previous.clear(Actions.LookupRedeclarationWithLinkage);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
392
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
393 Actions.LookupName(Previous, S, CreateBuiltins);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
394
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
395 // In C++, the previous declaration we find might be a tag type
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
396 // (class or enum). In this case, the new declaration will hide the
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
397 // tag type. Note that this does does not apply if we're declaring a
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
398 // typedef (C++ [dcl.typedef]p4).
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
399 if (Previous.isSingleTagDecl())
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
400 Previous.clear();
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
401 NamedDecl *New;
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
402 bool AddToScope = true;
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
403 if (R->isFunctionType()) {
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
404 New = Actions.ActOnFunctionDeclarator(S, D, DC, TInfo, Previous,
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
405 MultiTemplateParamsArg(), AddToScope);
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
406 } else {
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
407 New = Actions.ActOnVariableDeclarator(S, D, DC, TInfo, Previous,
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
408 MultiTemplateParamsArg(), AddToScope);
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
409 }
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
410
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
411 if (New->getDeclName() && AddToScope) {
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
412 // Only make a locally-scoped extern declaration visible if it is the first
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
413 // declaration of this entity. Qualified lookup for such an entity should
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
414 // only find this declaration if there is no visible declaration of it.
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
415 bool AddToContext = !D.isRedeclaration() || !New->isLocalExternDecl();
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
416 Actions.PushOnScopeChains(New, S, AddToContext);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
417 if (!AddToContext)
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
418 Actions.CurContext->addHiddenDecl(New);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
419 }
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
420
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
421 return New;
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
422 }
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
423
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
424 /// CreateSjForContinuationWithEnv - Create statements of setjmp for continuation with the environment.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
425 /// code example:
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
426 /// if (setjmp(__CbC_environment.env)){
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
427 /// return retval;
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
428 /// }
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
429 StmtResult Parser::CreateSjForContinuationWithTheEnv(){
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
430 SourceLocation Loc = Tok.getLocation();
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
431 StmtResult IfRes;
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
432 ParseScope IfScope(this, Scope::DeclScope | Scope::ControlScope, true/* C99 or CXX */);
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
433 ExprResult CondExp;
129
9ec641e857f8 Fix compile error to update llvm 5.0
mir3636
parents: 128
diff changeset
434 StmtResult InitStmt;
9ec641e857f8 Fix compile error to update llvm 5.0
mir3636
parents: 128
diff changeset
435 Sema::ConditionResult Cond;
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
436
108
1881386f7909 use llvm.setjmp and llvm.longjmp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 107
diff changeset
437 CondExp = LookupNameAndBuildExpr(CreateIdentifierInfo("__builtin_setjmp", Loc));
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
438 ExprVector ArgExprs;
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
439 ExprResult __envExprRes = CondExp.get();
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
440
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
441 __envExprRes = LookupNameAndBuildExpr(CreateIdentifierInfo(__CBC_ENVIRONMENT_NAME, Loc));
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
442 __envExprRes = LookupMemberAndBuildExpr(CreateIdentifierInfo(__CBC_STRUCT_ENV_NAME, Loc), __envExprRes.get(), false);
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
443
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
444 ArgExprs.push_back(__envExprRes.get());
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
445 CondExp = Actions.ActOnCallExpr(getCurScope(), CondExp.get(), Loc, ArgExprs, Loc, 0);
138
53f12981605a Fix goto is environment
anatofuz
parents: 136
diff changeset
446 Cond = Actions.ActOnCondition(getCurScope(), Loc, CondExp.get(), Sema::ConditionKind::Boolean);
53f12981605a Fix goto is environment
anatofuz
parents: 136
diff changeset
447
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
448
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
449 ParseScope InnerScope(this, Scope::DeclScope,false);
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
450 SourceLocation InnerStatementTrailingElseLoc;
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
451
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
452 StmtResult StmtRes;
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
453 ParseScope CompoundScope(this, Scope::DeclScope);
44
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
454 PrettyStackTraceLoc CrashInfo(PP.getSourceManager(),Loc,"in create setjmp statement for CbC");
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
455 StmtVector innerStmts;
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
456 StmtResult innerStmtRes;
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
457 ExprResult innerExprRes;
64
0aa33659e8e4 modified Parser::CreateUniqueIdentifierInfo(). add unique id
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
458 innerExprRes = LookupNameAndBuildExpr(CreateIdentifierInfo(__CBC_RETVAL_NAME, Loc));
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
459 innerStmtRes = Actions.ActOnReturnStmt(Loc, innerExprRes.get(), getCurScope());
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
460 if (innerStmtRes.isUsable())
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
461 innerStmts.push_back(innerStmtRes.get());
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
462 StmtRes = Actions.ActOnCompoundStmt(Loc, Loc,innerStmts, false);
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
463 StmtResult ThenStmt(StmtRes);
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
464 InnerScope.Exit();
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
465 IfScope.Exit();
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
466 StmtResult ElseStmt;
138
53f12981605a Fix goto is environment
anatofuz
parents: 136
diff changeset
467 IfRes = Actions.ActOnIfStmt(Loc, false, CondExp.get(), Cond, ThenStmt.get(),Loc, ElseStmt.get());
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
468 return IfRes;
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
469 }
42
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
470
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
471
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
472 /// LookupNameAndBuildExpr - Look up name, create ExprResult and return it.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
473 ExprResult Parser::LookupNameAndBuildExpr(IdentifierInfo *II, bool IsAddressOfOperand){
42
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
474 SourceLocation Loc = Tok.getLocation();
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
475 UnqualifiedId Name;
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
476 CXXScopeSpec SS;
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
477 SourceLocation TemplateKWLoc;
86
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
478 std::unique_ptr<ExternalSpace::CastExpressionIdValidator> Validator(new ExternalSpace::CastExpressionIdValidator(false,true));
42
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
479 Name.setIdentifier(II, Loc);
86
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
480 return Actions.ActOnIdExpression(getCurScope(), SS, TemplateKWLoc, Name, false, IsAddressOfOperand, std::move(Validator));
42
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
481 }
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
482
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
483 /// LookupMemberAndBuildExpr - Look up member name, create ExprResult and return it.
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
484 /// If IsArrow is true, the name is accessed by arrow operand.
42
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
485 ExprResult Parser::LookupMemberAndBuildExpr(IdentifierInfo *II, Expr* Base, bool IsArrow){
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
486 SourceLocation Loc = Tok.getLocation();
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
487 CXXScopeSpec SS;
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
488 UnqualifiedId Name;
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
489 SourceLocation TemplateKWLoc;
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
490 tok::TokenKind OpKind = (IsArrow ? tok::arrow : tok::period);
42
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
491 Name.setIdentifier(II,Loc);
97
b0dd3743370f LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 92
diff changeset
492 return Actions.ActOnMemberAccessExpr(getCurScope(), Base, Loc, OpKind, SS, TemplateKWLoc, Name, nullptr);
42
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
493 }
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
494
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
495
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
496 /// Create__CbC_envStruct - This method create "struct __CbC_env" which is used to continuation with environment.
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
497 /// If the __CbC_env has been already defined, it doesn't create __CbC_env again.
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
498 /// The example of struct which is created :
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
499 /// struct __CbC_env{
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
500 /// void *ret_p,*env;
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
501 /// };
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
502 void Parser::Create__CbC_envStruct(SourceLocation Loc, AccessSpecifier AS) {
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
503
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
504 IdentifierInfo *Name = CreateIdentifierInfo(__CBC_STRUCT_NAME, Loc);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
505 // Check previous definition. If the __CbC_env has been already defined, we have not to create again.
129
9ec641e857f8 Fix compile error to update llvm 5.0
mir3636
parents: 128
diff changeset
506 LookupResult Previous(Actions, Name, Loc, Actions.LookupTagName, Actions.ForVisibleRedeclaration);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
507 if(Actions.LookupName(Previous, getCurScope()))
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
508 return;
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
509
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
510 Scope *SavedScope = getCurScope();
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
511 DeclContext *SavedContext = Actions.CurContext;
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
512 sema::FunctionScopeInfo *SavedFSI = Actions.FunctionScopes.pop_back_val();
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
513
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
514 Actions.CurContext = static_cast<DeclContext *>(Actions.Context.getTranslationUnitDecl());
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
515 Scope *TopScope = getCurScope();
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
516 while(TopScope->getParent() != NULL)
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
517 TopScope = TopScope->getParent();
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
518 Actions.CurScope = TopScope;
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
519
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
520 ParsingDeclSpec SDS(*this);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
521 SDS.SetRangeStart(Loc);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
522 SDS.SetRangeEnd(Loc);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
523 DeclSpec::TST TagType = DeclSpec::TST_struct;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
524 DeclResult TagOrTempResult = true;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
525 bool Owned = false;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
526 bool IsDependent = false;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
527 ParsedAttributesWithRange attrs(AttrFactory);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
528 MultiTemplateParamsArg TParams;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
529
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
530 TagOrTempResult = Actions.ActOnTag(getCurScope(), TagType, Sema::TUK_Definition, Loc,
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
531 SDS.getTypeSpecScope(), Name, Loc, attrs.getList(), AS,
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
532 SDS.getModulePrivateSpecLoc(), TParams, Owned, IsDependent,
129
9ec641e857f8 Fix compile error to update llvm 5.0
mir3636
parents: 128
diff changeset
533 SourceLocation(), false, clang::TypeResult(), false, false);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
534
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
535 Decl *TagDecl = TagOrTempResult.get();
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
536 PrettyDeclStackTraceEntry CrashInfo(Actions, TagDecl, Loc, "parsing struct/union body");
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
537 ParseScope StructScope(this, Scope::ClassScope|Scope::DeclScope);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
538 Actions.ActOnTagStartDefinition(getCurScope(), TagDecl);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
539 SmallVector<Decl *, 32> FieldDecls;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
540
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
541 FieldDecls.push_back(Create__CbC_envBody(TagDecl, DeclSpec::TST_void, Loc, __CBC_STRUCT_POINTER_NAME));
108
1881386f7909 use llvm.setjmp and llvm.longjmp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 107
diff changeset
542 FieldDecls.push_back(Create__CbC_envBody(TagDecl, DeclSpec::TST_void, Loc, __CBC_STRUCT_ENV_NAME));
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
543
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
544 Actions.ActOnFields(getCurScope(),Loc, TagDecl, FieldDecls,Loc, Loc,attrs.getList());
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
545 StructScope.Exit();
72
9943a04bf572 remove unnecessary codes
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
546 Actions.ActOnTagFinishDefinition(getCurScope(), TagDecl, Loc);
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
547
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
548 Actions.CurScope = SavedScope;
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
549 Actions.CurContext = SavedContext;
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
550 Actions.FunctionScopes.push_back(SavedFSI);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
551 }
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
552
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
553 /// Create__CbC_envBody - Create void type pointer ret_p and env which are member of __CbC_env.
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
554 Decl* Parser::Create__CbC_envBody(Decl* TagDecl, DeclSpec::TST T, SourceLocation Loc, const char* Name){
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
555 const PrintingPolicy &Policy = Actions.getASTContext().getPrintingPolicy();
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
556 ParsingDeclSpec PDS(*this);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
557 setTST(&PDS, T);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
558 SourceLocation CommaLoc;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
559 ParsingFieldDeclarator DeclaratorInfo(*this, PDS);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
560 DeclaratorInfo.D.setCommaLoc(CommaLoc);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
561 DeclaratorInfo.D.SetRangeEnd(Loc);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
562 DeclSpec DS(AttrFactory);
103
76d4b0e44709 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 98
diff changeset
563 DS.Finish(Actions, Policy);
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
564 DeclaratorInfo.D.SetIdentifier(CreateIdentifierInfo(Name, Loc),Loc);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
565
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
566 DeclaratorInfo.D.AddTypeInfo(DeclaratorChunk::getPointer(DS.getTypeQualifiers(), Loc,DS.getConstSpecLoc(),
128
mir3636
parents: 126
diff changeset
567 DS.getVolatileSpecLoc(),DS.getRestrictSpecLoc(), DS.getAtomicSpecLoc(), DS.getUnalignedSpecLoc()),
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
568 DS.getAttributes(),SourceLocation());
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
569 Decl *Field = Actions.ActOnField(getCurScope(), TagDecl,
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
570 DeclaratorInfo.D.getDeclSpec().getSourceRange().getBegin(),
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
571 DeclaratorInfo.D, DeclaratorInfo.BitfieldSize);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
572 DeclaratorInfo.complete(Field);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
573 return Field;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
574 }
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
575
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
576 /// CreateIdentifierInfo - Create IdentifierInfo from char pointer.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
577 /// usage :
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
578 /// IdentifierInfo *II = CreateIdentifierInfo(IIName, Location);
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
579 IdentifierInfo* Parser::CreateIdentifierInfo(const char* Name, SourceLocation Loc) {
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
580 int length = strlen(Name);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
581 Token TokenForII;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
582 TokenForII.startToken();
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
583 TokenForII.setLocation(Loc);
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
584 TokenForII.setLength(length);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
585 TokenForII.setKind(tok::raw_identifier);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
586 TokenForII.setRawIdentifierData(Name);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
587 IdentifierInfo *II;
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
588 II = PP.getIdentifierInfo(TokenForII.getRawIdentifier());
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
589 TokenForII.setIdentifierInfo(II);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
590 TokenForII.setKind(II->getTokenID());
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
591 return II;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
592 }
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
593
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
594 /// CreateUniqueIdentifierInfo - Create unique IdentifierInfo.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
595 /// IdentifierInfos have unique name which were created by this function.
64
0aa33659e8e4 modified Parser::CreateUniqueIdentifierInfo(). add unique id
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
596 /// Naming conventions :
0aa33659e8e4 modified Parser::CreateUniqueIdentifierInfo(). add unique id
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
597 /// current 'function name' '..' 'variable name' 'uniqueID'
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
598 /// For example, if current function's name is 'main' and variable name is 'auaua', IdentifierInfo's name is 'main..auaua'.
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
599 IdentifierInfo* Parser::CreateUniqueIdentifierInfo(const char* Name, SourceLocation Loc){
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
600 IdentifierInfo *II;
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
601 std::ostringstream os;
64
0aa33659e8e4 modified Parser::CreateUniqueIdentifierInfo(). add unique id
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
602
0aa33659e8e4 modified Parser::CreateUniqueIdentifierInfo(). add unique id
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
603 os << curFuncName << ".." /* separator */ << Name << UniqueId;
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
604 II = CreateIdentifierInfo(os.str().c_str(), Loc);
64
0aa33659e8e4 modified Parser::CreateUniqueIdentifierInfo(). add unique id
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
605 UniqueId++; // Modify the unique ID.
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
606 return II;
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
607 }
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
608
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
609
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
610 /// CreateRetCS - Create code segment which is used for continuation with the environment.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
611 /// create these codes:
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
612 /// __code ret(return_type retval, void *env){
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
613 /// *(return_type)((struct CbC_environment *)(env))->ret_p = n;
108
1881386f7909 use llvm.setjmp and llvm.longjmp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 107
diff changeset
614 /// longjmp((void*)(((struct __CbC_environment *)env)->env),1);
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
615 /// }
81
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
616 void Parser::CreateRetCS(IdentifierInfo *csName){
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
617 const PrintingPolicy &Policy = Actions.getASTContext().getPrintingPolicy();
81
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
618 QualType CurFuncResQT = Actions.getCurFunctionDecl()->getReturnType();
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
619
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
620 Scope *SavedScope = getCurScope();
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
621 DeclContext *SavedContext = Actions.CurContext;
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
622 TypeSourceInfo *CurFuncTI = Actions.Context.CreateTypeSourceInfo(CurFuncResQT);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
623 sema::FunctionScopeInfo *SavedFSI = Actions.FunctionScopes.pop_back_val();
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
624
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
625 Actions.CurContext = static_cast<DeclContext *>(Actions.Context.getTranslationUnitDecl());
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
626 Scope *TopScope = getCurScope();
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
627 while(TopScope->getParent() != NULL)
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
628 TopScope = TopScope->getParent();
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
629 Actions.CurScope = TopScope;
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
630
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
631 DeclGroupPtrTy returnDecl = DeclGroupPtrTy();
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
632 SourceLocation Loc = Tok.getLocation();
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
633 ParsingDeclSpec PDS(*this);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
634 setTST(&PDS, DeclSpec::TST___code);
136
6cd7e602c98b Fix compile error to update llvm 5.0.1
mir3636
parents: 129
diff changeset
635 ParsingDeclarator D(*this, PDS, static_cast<DeclaratorContext>(DeclaratorContext::FileContext));
64
0aa33659e8e4 modified Parser::CreateUniqueIdentifierInfo(). add unique id
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
636 D.SetIdentifier(csName, Loc);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
637 ParseScope PrototypeScope(this,Scope::FunctionPrototypeScope|Scope::DeclScope|Scope::FunctionDeclarationScope);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
638 bool IsAmbiguous = false;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
639 bool HasProto = true;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
640 SmallVector<DeclaratorChunk::ParamInfo, 16> ParamInfo;
86
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
641 SourceLocation EllipsisLoc, RefQualifierLoc, ConstQualifierLoc, VolatileQualifierLoc, RestrictQualifierLoc;
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
642 DeclSpec FDS(AttrFactory);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
643 bool RefQualifierIsLValueRef = true;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
644 ExceptionSpecificationType ESpecType = EST_None;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
645 SourceRange ESpecRange;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
646 SmallVector<ParsedType, 2> DynamicExceptions;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
647 SmallVector<SourceRange, 2> DynamicExceptionRanges;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
648 ExprResult NoexceptExpr;
86
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
649 CachedTokens *ExceptionSpecTokens = 0;
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
650 ParsedAttributes FnAttrs(AttrFactory);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
651 TypeResult TrailingReturnType;
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
652 ParmVarDecl *Param;
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
653
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
654 IdentifierInfo *retvalII = CreateIdentifierInfo(__CBC_RETVAL_NAME, Loc);
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
655 Param = CreateParam(retvalII);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
656 Param->setTypeSourceInfo(CurFuncTI);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
657 Param->setType(CurFuncResQT);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
658
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
659 ParamInfo.push_back(DeclaratorChunk::ParamInfo(retvalII, Loc, Param, 0));
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
660 IdentifierInfo *envII = CreateIdentifierInfo(__CBC_STRUCT_ENV_NAME, Loc);
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
661 Param = CreateParam(envII, 1, DeclSpec::TST_void);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
662 ParamInfo.push_back(DeclaratorChunk::ParamInfo(envII, Loc, Param, 0));
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
663
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
664 D.AddTypeInfo(DeclaratorChunk::getFunction(HasProto, IsAmbiguous, Loc, ParamInfo.data(), ParamInfo.size(), EllipsisLoc, Loc,
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
665 FDS.getTypeQualifiers(), RefQualifierIsLValueRef, RefQualifierLoc, ConstQualifierLoc,
86
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
666 VolatileQualifierLoc, RestrictQualifierLoc, SourceLocation(),
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
667 ESpecType, ESpecRange.getBegin(),
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
668 DynamicExceptions.data(), DynamicExceptionRanges.data(), DynamicExceptions.size(),
128
mir3636
parents: 126
diff changeset
669 NoexceptExpr.isUsable() ? NoexceptExpr.get() : 0, ExceptionSpecTokens, None,
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
670 Loc, Loc, D, TrailingReturnType), FnAttrs, Loc);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
671 PrototypeScope.Exit();
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
672
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
673 Decl *TheDecl;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
674 ParseScope BodyScope(this, Scope::FnScope|Scope::DeclScope);
97
b0dd3743370f LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 92
diff changeset
675 Sema::SkipBodyInfo SkipBody;
b0dd3743370f LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 92
diff changeset
676 const ParsedTemplateInfo &TemplateInfo = ParsedTemplateInfo();
b0dd3743370f LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 92
diff changeset
677 Decl *BodyRes = Actions.ActOnStartOfFunctionDef(getCurScope(), D,
b0dd3743370f LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 92
diff changeset
678 TemplateInfo.TemplateParams ? *TemplateInfo.TemplateParams : MultiTemplateParamsArg(),
b0dd3743370f LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 92
diff changeset
679 &SkipBody);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
680
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
681 D.complete(BodyRes);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
682 D.getMutableDeclSpec().abort();
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
683 Actions.ActOnDefaultCtorInitializers(BodyRes);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
684 StmtResult FnBody;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
685 StmtVector FnStmts;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
686 StmtResult innerR;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
687 ExprResult retvalAssginmentExpr,LHS;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
688 ExprVector ArgExprs;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
689 CommaLocsTy CommaLocs;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
690 DeclSpec envDS(AttrFactory);
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
691 IdentifierInfo *structName = CreateIdentifierInfo(__CBC_STRUCT_NAME, Loc);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
692 setTST(&envDS, DeclSpec::TST_struct, structName);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
693
136
6cd7e602c98b Fix compile error to update llvm 5.0.1
mir3636
parents: 129
diff changeset
694 Declarator envDInfo(envDS, DeclaratorContext::TypeNameContext);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
695 envDInfo.SetRangeEnd(Loc);
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
696 DeclSpec starDS(AttrFactory);
103
76d4b0e44709 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 98
diff changeset
697 starDS.Finish(Actions, Policy);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
698 envDInfo.SetIdentifier(0,Loc);
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
699 envDInfo.AddTypeInfo(DeclaratorChunk::getPointer(starDS.getTypeQualifiers(), Loc,
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
700 starDS.getConstSpecLoc(),
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
701 starDS.getVolatileSpecLoc(),
97
b0dd3743370f LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 92
diff changeset
702 starDS.getRestrictSpecLoc(),
128
mir3636
parents: 126
diff changeset
703 starDS.getAtomicSpecLoc(),
mir3636
parents: 126
diff changeset
704 starDS.getUnalignedSpecLoc()),
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
705 starDS.getAttributes(),
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
706 SourceLocation());
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
707 ExprVector ArgExprs2;
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
708 LHS = LookupNameAndBuildExpr(envII);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
709 ArgExprs2.push_back(LHS.get());
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
710 LHS = Actions.ActOnParenListExpr(Loc, Loc, ArgExprs2);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
711 Expr *envCastExpr = LHS.get();
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
712 TypeSourceInfo *castTInfo = Actions.GetTypeForDeclaratorCast(envDInfo, envCastExpr->getType());
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
713 LHS = Actions.MaybeConvertParenListExprToParenExpr(getCurScope(), envCastExpr);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
714 envCastExpr = LHS.get();
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
715 LHS = Actions.BuildCStyleCastExpr(Loc, castTInfo, Loc, envCastExpr);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
716 ArgExprs.push_back(LHS.get());
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
717 LHS = Actions.ActOnParenListExpr(Loc, Loc, ArgExprs);
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
718 LHS = LookupMemberAndBuildExpr(CreateIdentifierInfo(__CBC_STRUCT_POINTER_NAME, Loc),
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
719 LHS.get(), true);
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
720 Expr *ret_pCastExpr = LHS.get();
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
721 DeclarationName noValDeclName;
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
722 TypeSourceInfo *CurFuncTypesPointerTI = Actions.Context.CreateTypeSourceInfo(Actions.BuildPointerType(CurFuncResQT, Loc, noValDeclName));
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
723 LHS = Actions.BuildCStyleCastExpr(Loc, CurFuncTypesPointerTI, Loc, ret_pCastExpr);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
724 LHS = Actions.ActOnUnaryOp(getCurScope(), Loc, tok::star, LHS.get());
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
725 ExprResult RHS;
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
726 RHS = LookupNameAndBuildExpr(retvalII);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
727
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
728 retvalAssginmentExpr = Actions.ActOnBinOp(getCurScope(), Loc, tok::equal, LHS.get(), RHS.get());
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
729 innerR = Actions.ActOnExprStmt(retvalAssginmentExpr);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
730 if(innerR.isUsable())
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
731 FnStmts.push_back(innerR.get());
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
732
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
733 ExprResult ljExpr,ljLHS;
108
1881386f7909 use llvm.setjmp and llvm.longjmp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 107
diff changeset
734 ljExpr = IIToExpr(CreateIdentifierInfo("__builtin_longjmp", Loc), tok::l_paren);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
735 ExprVector ljArgExprs;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
736 DeclSpec ljDS(AttrFactory);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
737 setTST(&ljDS, DeclSpec::TST_struct, structName);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
738
136
6cd7e602c98b Fix compile error to update llvm 5.0.1
mir3636
parents: 129
diff changeset
739 Declarator ljD(ljDS, DeclaratorContext::TypeNameContext);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
740 ljD.SetRangeEnd(Loc);
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
741 DeclSpec starDS2(AttrFactory);
103
76d4b0e44709 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 98
diff changeset
742 starDS2.Finish(Actions, Policy);
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
743 ljD.ExtendWithDeclSpec(starDS2);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
744 ljD.SetIdentifier(0, Loc);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
745 ljD.AddTypeInfo(DeclaratorChunk::getPointer(ljDS.getTypeQualifiers(), Loc,
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
746 ljDS.getConstSpecLoc(),
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
747 ljDS.getVolatileSpecLoc(),
97
b0dd3743370f LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 92
diff changeset
748 ljDS.getRestrictSpecLoc(),
128
mir3636
parents: 126
diff changeset
749 ljDS.getAtomicSpecLoc(),
mir3636
parents: 126
diff changeset
750 ljDS.getUnalignedSpecLoc()),
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
751 ljDS.getAttributes(),
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
752 SourceLocation());
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
753 ljLHS = LookupNameAndBuildExpr(envII);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
754 Expr *ljCastExpr = ljLHS.get();
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
755 TypeSourceInfo *ljCastTInfo = Actions.GetTypeForDeclaratorCast(ljD, ljCastExpr->getType());
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
756 ljLHS = Actions.BuildCStyleCastExpr(Loc, ljCastTInfo, Loc, ljCastExpr);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
757 ljLHS = Actions.ActOnParenExpr(Loc, Loc, ljLHS.get());
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
758 ljLHS = LookupMemberAndBuildExpr(envII, ljLHS.get(), true);
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
759 ljLHS = Actions.ActOnParenExpr(Loc, Loc, ljLHS.get());
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
760 ljArgExprs.push_back(ljLHS.get());
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
761 CommaLocs.push_back(Loc);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
762 ljLHS = Actions.ActOnIntegerConstant(Loc, 1 /* return value for setjmp */);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
763 ljArgExprs.push_back(ljLHS.get());
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
764 ljExpr = Actions.ActOnCallExpr(getCurScope(), ljExpr.get(), Loc, ljArgExprs, Loc, 0);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
765 innerR = Actions.ActOnExprStmt(ljExpr);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
766 if(innerR.isUsable())
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
767 FnStmts.push_back(innerR.get());
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
768 FnBody = Actions.ActOnCompoundStmt(Loc, Loc, FnStmts, false);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
769 BodyScope.Exit();
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
770 TheDecl = Actions.ActOnFinishFunctionBody(BodyRes, FnBody.get());
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
771 returnDecl = Actions.ConvertDeclToDeclGroup(TheDecl);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
772 (&Actions.getASTConsumer())->HandleTopLevelDecl(returnDecl.get());
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
773 Actions.CurScope = SavedScope;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
774 Actions.CurContext = SavedContext;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
775 Actions.FunctionScopes.push_back(SavedFSI);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
776 }
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
777
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
778 /// IIToExpr - Create ExprResult from IdentifierInfo.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
779 /// It is used when II is a not primary expression such as not primary types, a function's name, etc.
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
780 ExprResult Parser::IIToExpr(IdentifierInfo *II, tok::TokenKind Kind){
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
781 SourceLocation Loc = Tok.getLocation();
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
782 Token Next,IITok;
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
783 Next.setKind(Kind);
86
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
784 std::unique_ptr<ExternalSpace::StatementFilterCCC> CCCValidator(new ExternalSpace::StatementFilterCCC(Next));
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
785 CXXScopeSpec SS;
86
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
786 Sema::NameClassification Classification = Actions.ClassifyName(getCurScope(), SS, II, Loc, Next, false, std::move(CCCValidator));
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
787 IITok.startToken();
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
788 IITok.setLocation(Loc);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
789 IITok.setIdentifierInfo(II);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
790 IITok.setKind(tok::annot_primary_expr);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
791 setExprAnnotation(IITok, Classification.getExpression());
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
792 IITok.setAnnotationEndLoc(Loc);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
793 PP.AnnotateCachedTokens(IITok);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
794 return getExprAnnotation(IITok);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
795 }
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
796
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
797 /// CreateComplexStmtRet - Create return value for complex statements.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
798 ///
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
799 /// ({ /* some statements */
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
800 /// return_value; )};
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
801 /// ^^^^^^^^^^^^^ Create it.
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
802 StmtResult Parser::CreateComplexStmtRet(IdentifierInfo *II, bool IsAddressOfOperand){
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
803 ExprResult ER;
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
804 if (IsAddressOfOperand) {
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
805 ER = LookupNameAndBuildExpr(II, true);
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
806 ER = Actions.ActOnUnaryOp(getCurScope(), Tok.getLocation(), tok::amp, ER.get());
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
807 }
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
808 else
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
809 ER = IIToExpr(II,tok::semi);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
810 return Actions.ActOnExprStmt(ER);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
811 }
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
812
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
813 /// CreateParam - Create paramator for functions.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
814 ///
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
815 /// int funcname(int aua) {
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
816 /// ^^^^^^^ Create it.
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
817 ParmVarDecl* Parser::CreateParam(IdentifierInfo *II, int pointerNum, DeclSpec::TST T){
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
818 const PrintingPolicy &Policy = Actions.getASTContext().getPrintingPolicy();
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
819 SourceLocation Loc = Tok.getLocation();
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
820 DeclSpec DS(AttrFactory);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
821 setTST(&DS, T);
136
6cd7e602c98b Fix compile error to update llvm 5.0.1
mir3636
parents: 129
diff changeset
822 Declarator ParamDeclarator(DS, DeclaratorContext::PrototypeContext);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
823 ParamDeclarator.SetIdentifier(II, Loc);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
824 for(int i = 0;i<pointerNum; i++){
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
825 DeclSpec pointerDS(AttrFactory);
103
76d4b0e44709 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 98
diff changeset
826 pointerDS.Finish(Actions, Policy);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
827 ParamDeclarator.AddTypeInfo(DeclaratorChunk::getPointer(pointerDS.getTypeQualifiers(), Loc,
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
828 pointerDS.getConstSpecLoc(),
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
829 pointerDS.getVolatileSpecLoc(),
97
b0dd3743370f LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 92
diff changeset
830 pointerDS.getRestrictSpecLoc(),
128
mir3636
parents: 126
diff changeset
831 pointerDS.getAtomicSpecLoc(),
mir3636
parents: 126
diff changeset
832 pointerDS.getUnalignedSpecLoc()),
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
833 pointerDS.getAttributes(),SourceLocation());
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
834 }
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
835 ParmVarDecl *Param = dyn_cast<ParmVarDecl>(Actions.ActOnParamDeclarator(getCurScope(), ParamDeclarator));
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
836 return Param;
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
837
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
838 }
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
839
63
0d1cf6cb7029 add comments for setTST
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
840 /// setTST - set TypeSpecifierType(TST) DeclSpec.
0d1cf6cb7029 add comments for setTST
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
841 /// TST is specifiers the kind of type such as int, double, char, etc.
106
596a38ee9c9e fix setjmp/longjmp with optimization bug (get some warnings)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 105
diff changeset
842 void Parser::setTST(DeclSpec *DS, DeclSpec::TST T, IdentifierInfo* Name, DeclSpec::TQ TQ){
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
843 const PrintingPolicy &Policy = Actions.getASTContext().getPrintingPolicy();
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
844 SourceLocation Loc = Tok.getLocation();
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
845 bool isInvalid = false;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
846 const char *PrevSpec = 0;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
847 unsigned DiagID = 0;
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
848 CXXScopeSpec SS;
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
849 DS->SetRangeStart(Loc);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
850 DS->SetRangeEnd(Loc);
106
596a38ee9c9e fix setjmp/longjmp with optimization bug (get some warnings)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 105
diff changeset
851 if (TQ != DeclSpec::TQ_unspecified) {
596a38ee9c9e fix setjmp/longjmp with optimization bug (get some warnings)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 105
diff changeset
852 isInvalid = DS->SetTypeQual(DeclSpec::TQ_volatile, Loc, PrevSpec, DiagID,
596a38ee9c9e fix setjmp/longjmp with optimization bug (get some warnings)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 105
diff changeset
853 getLangOpts());
596a38ee9c9e fix setjmp/longjmp with optimization bug (get some warnings)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 105
diff changeset
854 }
596a38ee9c9e fix setjmp/longjmp with optimization bug (get some warnings)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 105
diff changeset
855
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
856 if (T == DeclSpec::TST_struct) {
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
857 ParsedAttributesWithRange attrs(AttrFactory);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
858 DeclResult TagOrTempResult = true;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
859 bool Owned = false;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
860 bool IsDependent = false;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
861 MultiTemplateParamsArg TParams;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
862 TagOrTempResult = Actions.ActOnTag(getCurScope(), T, Sema::TUK_Reference, Loc,
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
863 SS, Name, Loc, attrs.getList(), AS_none,
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
864 DS->getModulePrivateSpecLoc(),
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
865 TParams, Owned, IsDependent,
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
866 SourceLocation(), false,
129
9ec641e857f8 Fix compile error to update llvm 5.0
mir3636
parents: 128
diff changeset
867 clang::TypeResult(), false, false);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
868 isInvalid = DS->SetTypeSpecType(T, Loc, Loc, PrevSpec, DiagID, TagOrTempResult.get(), Owned, Policy);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
869 }
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
870 else if (T == DeclSpec::TST_typename) {
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
871 Token Next,TypeTok;
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
872 Next.setKind(tok::identifier);
86
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
873 std::unique_ptr<ExternalSpace::StatementFilterCCC> CCCValidator(new ExternalSpace::StatementFilterCCC(Next));
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
874 Sema::NameClassification Classification = Actions.ClassifyName(getCurScope(), SS, Name, Loc, Next, false, std::move(CCCValidator));
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
875 TypeTok.startToken();
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
876 TypeTok.setLocation(Loc);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
877 TypeTok.setIdentifierInfo(Name);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
878 TypeTok.setKind(tok::annot_typename);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
879 setTypeAnnotation(TypeTok, Classification.getType());
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
880 TypeTok.setAnnotationEndLoc(Loc);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
881 PP.AnnotateCachedTokens(TypeTok);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
882 if (TypeTok.getAnnotationValue()) {
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
883 ParsedType PT = getTypeAnnotation(TypeTok);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
884 isInvalid = DS->SetTypeSpecType(T, Loc, PrevSpec, DiagID, PT, Policy);
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
885 } else
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
886 DS->SetTypeSpecError();
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
887 }
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
888 else
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
889 isInvalid = DS->SetTypeSpecType(T, Loc, PrevSpec, DiagID, Policy);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
890
103
76d4b0e44709 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 98
diff changeset
891 DS->Finish(Actions, Policy);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
892 if (isInvalid) {
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
893 assert(PrevSpec && "Method did not return previous specifier!");
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
894 assert(DiagID);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
895 if (DiagID == diag::ext_duplicate_declspec)
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
896 Diag(Tok, DiagID)
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
897 << PrevSpec << FixItHint::CreateRemoval(Tok.getLocation());
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
898 else
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
899 Diag(Tok, DiagID) << PrevSpec;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
900 }
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
901 }
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
902
58
01c954c1b51b include setjmp.h automatically without checking __code
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
903 /// CheckTheSjHeader - Check whether setjmp.h has been already included or not.
01c954c1b51b include setjmp.h automatically without checking __code
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
904 /// If not, include it.
01c954c1b51b include setjmp.h automatically without checking __code
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
905 void Parser::CheckTheSjHeader(){
53
f679cc5126db include setjmp.h automatically
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 52
diff changeset
906 SourceLocation Loc = Tok.getLocation();
129
9ec641e857f8 Fix compile error to update llvm 5.0
mir3636
parents: 128
diff changeset
907 LookupResult R(Actions, CreateIdentifierInfo("setjmp", Loc), Loc, Actions.LookupOrdinaryName, Actions.ForVisibleRedeclaration);
58
01c954c1b51b include setjmp.h automatically without checking __code
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
908 if (!Actions.LookupName(R, getCurScope())){ // look up the setjmp
01c954c1b51b include setjmp.h automatically without checking __code
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
909 if (PP.IncludeHeader(Tok, "setjmp.h"))
01c954c1b51b include setjmp.h automatically without checking __code
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
910 ConsumeToken();
53
f679cc5126db include setjmp.h automatically
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 52
diff changeset
911 }
f679cc5126db include setjmp.h automatically
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 52
diff changeset
912 }
81
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
913
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
914 /// isVoidFunction - Return true if current function return type is void.
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
915 bool Parser::isVoidFunction(){
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
916 return Actions.getCurFunctionDecl()->getReturnType().getTypePtr()->isVoidType();
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
917 }
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
918
87
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
919 /// ParseCbCGotoStatement
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
920 /// jump-statement:
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
921 /// [CbC] 'goto' codeSegment ';'
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
922 ///
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
923 StmtResult Parser::ParseCbCGotoStatement(ParsedAttributesWithRange &Attrs,StmtVector &Stmts) {
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
924 assert(Tok.is(tok::kw_goto) && "Not a goto stmt!");
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
925 ParseScope CompoundScope(this, Scope::DeclScope);
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
926 StmtVector CompoundedStmts;
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
927
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
928 SourceLocation gotoLoc = ConsumeToken(); // eat the 'goto'.
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
929 StmtResult gotoRes;
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
930 Token TokAfterGoto = Tok;
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
931 Stmtsp = &Stmts;
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
932
103
76d4b0e44709 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 98
diff changeset
933 gotoRes = ParseStatementOrDeclaration(Stmts, ACK_Any);
92
8a1cd0ffee6e Create prototype declaration automatically if prototype was not found when parsing continuation arguments.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 91
diff changeset
934
87
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
935 if (gotoRes.get() == NULL)
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
936 return StmtError();
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
937 else if (gotoRes.get()->getStmtClass() != Stmt::CallExprClass) { // if it is not function call
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
938 unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error, "expected identifier or codesegment call");
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
939 Diag(TokAfterGoto, DiagID);
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
940 return StmtError();
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
941 }
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
942
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
943 assert((Attrs.empty() || gotoRes.isInvalid() || gotoRes.isUsable()) &&
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
944 "attributes on empty statement");
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
945 if (!(Attrs.empty() || gotoRes.isInvalid()))
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
946 gotoRes = Actions.ProcessStmtAttributes(gotoRes.get(), Attrs.getList(), Attrs.Range);
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
947 if (gotoRes.isUsable())
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
948 CompoundedStmts.push_back(gotoRes.get());
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
949
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
950 // add return; after goto codesegment();
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
951 if (Actions.getCurFunctionDecl()->getReturnType().getTypePtr()->is__CodeType()) {
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
952 ExprResult retExpr;
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
953 StmtResult retRes;
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
954 retRes = Actions.ActOnReturnStmt(gotoLoc, retExpr.get(), getCurScope());
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
955 if (retRes.isUsable())
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
956 CompoundedStmts.push_back(retRes.get());
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
957 }
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
958 return Actions.ActOnCompoundStmt(gotoLoc, Tok.getLocation(), CompoundedStmts, false);
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
959 }
88
e471d82fb99b add SearchCodeSegmentDeclaration()
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
960
e471d82fb99b add SearchCodeSegmentDeclaration()
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
961 /// SearchCodeSegmentDeclaration - Read tokens until we get to the specified code segment declaration.
e471d82fb99b add SearchCodeSegmentDeclaration()
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
962 /// If we can't find it , return false;
e471d82fb99b add SearchCodeSegmentDeclaration()
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
963 bool Parser::SearchCodeSegmentDeclaration(std::string Name){
90
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
964 while(SkipAnyUntil(tok::kw___code, StopBeforeMatch)){
89
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
965 if(NextToken().is(tok::identifier) && NextToken().getIdentifierInfo()->getName().str() == Name)
88
e471d82fb99b add SearchCodeSegmentDeclaration()
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
966 return true;
89
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
967 ConsumeToken();
88
e471d82fb99b add SearchCodeSegmentDeclaration()
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
968 }
e471d82fb99b add SearchCodeSegmentDeclaration()
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
969 return false;
e471d82fb99b add SearchCodeSegmentDeclaration()
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
970 }
89
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
971
92
8a1cd0ffee6e Create prototype declaration automatically if prototype was not found when parsing continuation arguments.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 91
diff changeset
972 bool Parser::NeedPrototypeDeclaration(Token IITok){
8a1cd0ffee6e Create prototype declaration automatically if prototype was not found when parsing continuation arguments.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 91
diff changeset
973 LookupResult LR(Actions, IITok.getIdentifierInfo(), IITok.getLocation(), Actions.LookupOrdinaryName);
8a1cd0ffee6e Create prototype declaration automatically if prototype was not found when parsing continuation arguments.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 91
diff changeset
974 CXXScopeSpec SS;
8a1cd0ffee6e Create prototype declaration automatically if prototype was not found when parsing continuation arguments.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 91
diff changeset
975 Actions.LookupParsedName(LR, getCurScope(), &SS, !(Actions.getCurMethodDecl()));
8a1cd0ffee6e Create prototype declaration automatically if prototype was not found when parsing continuation arguments.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 91
diff changeset
976
8a1cd0ffee6e Create prototype declaration automatically if prototype was not found when parsing continuation arguments.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 91
diff changeset
977 return (LR.getResultKind() == LookupResult::NotFound);
8a1cd0ffee6e Create prototype declaration automatically if prototype was not found when parsing continuation arguments.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 91
diff changeset
978 }
8a1cd0ffee6e Create prototype declaration automatically if prototype was not found when parsing continuation arguments.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 91
diff changeset
979
89
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
980 /// CreatePrototypeDeclaration - Create prototype declaration by it's definition.
92
8a1cd0ffee6e Create prototype declaration automatically if prototype was not found when parsing continuation arguments.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 91
diff changeset
981 void Parser::CreatePrototypeDeclaration(){
89
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
982 // move to the top level scope
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
983 Scope *SavedScope = getCurScope();
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
984 DeclContext *SavedContext = Actions.CurContext;
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
985 sema::FunctionScopeInfo *SavedFSI = Actions.FunctionScopes.pop_back_val();
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
986 Actions.CurContext = static_cast<DeclContext *>(Actions.Context.getTranslationUnitDecl());
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
987 Scope *TopScope = getCurScope();
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
988 while(TopScope->getParent() != NULL)
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
989 TopScope = TopScope->getParent();
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
990 Actions.CurScope = TopScope;
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
991
92
8a1cd0ffee6e Create prototype declaration automatically if prototype was not found when parsing continuation arguments.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 91
diff changeset
992 Token Next = NextToken();
8a1cd0ffee6e Create prototype declaration automatically if prototype was not found when parsing continuation arguments.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 91
diff changeset
993 Token CachedTokens[3] = {Next, PP.LookAhead(1)};
89
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
994 Token SavedToken = Tok;
92
8a1cd0ffee6e Create prototype declaration automatically if prototype was not found when parsing continuation arguments.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 91
diff changeset
995 Token IITok = Tok.is(tok::identifier) ? Tok : Next;
89
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
996 PP.ClearCache();
98
88e6d15e811d fix proto generator bug
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 97
diff changeset
997 PP.ProtoParsing = true;
89
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
998 ProtoParsing = true;
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
999
97
b0dd3743370f LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 92
diff changeset
1000 const DirectoryLookup *CurDir = nullptr;
89
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
1001 FileID FID = PP.getSourceManager().createFileID(PP.getCurrentFileLexer()->getFileEntry(), IITok.getLocation(), SrcMgr::C_User);
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
1002 PP.EnterSourceFile(FID,CurDir,IITok.getLocation());
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
1003 ConsumeToken();
90
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1004
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1005 if(SearchCodeSegmentDeclaration(IITok.getIdentifierInfo()->getName().str())){
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1006 DeclGroupPtrTy ProtoDecl;
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1007 ParseTopLevelDecl(ProtoDecl);
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1008 // add declaration to AST.
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1009 if(ProtoDecl)
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1010 (&Actions.getASTConsumer())->HandleTopLevelDecl(ProtoDecl.get());
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1011 // File Closing
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1012 Token T;
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1013 PP.HandleEndOfFile(T, false);
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1014
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1015 // recover tokens.
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1016 Tok = SavedToken;
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1017 PP.RestoreTokens(CachedTokens, 2);
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1018
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1019 }
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1020 else {
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1021 // recover tokens.
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1022 CachedTokens[2] = Tok;
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1023 Tok = SavedToken;
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1024 PP.RestoreTokens(CachedTokens, 3);
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1025 }
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1026
89
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
1027 // move to the previous scope.
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
1028 Actions.CurScope = SavedScope;
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
1029 Actions.CurContext = SavedContext;
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
1030 Actions.FunctionScopes.push_back(SavedFSI);
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
1031
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
1032 ProtoParsing = false;
98
88e6d15e811d fix proto generator bug
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 97
diff changeset
1033 PP.ProtoParsing = false;
89
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
1034 }
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
1035
90
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1036 static bool HasFlagsSet(Parser::SkipUntilFlags L, Parser::SkipUntilFlags R) {
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1037 return (static_cast<unsigned>(L) & static_cast<unsigned>(R)) != 0;
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1038 }
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1039
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1040 bool Parser::SkipAnyUntil(tok::TokenKind T, SkipUntilFlags Flags){
91
ae2ab28b985c fix bug: When we check the file is ended or not on SearchCodeSegmentDeclaration, we look up not the current lexer but the current file lexer.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 90
diff changeset
1041 const PreprocessorLexer *L = PP.getCurrentFileLexer();
90
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1042 while(1){
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1043 if(Tok.is(T)){
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1044 if (HasFlagsSet(Flags, StopBeforeMatch)) {
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1045 // Noop, don't consume the token.
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1046 } else {
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1047 ConsumeAnyToken();
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1048 }
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1049 return true;
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1050 }
91
ae2ab28b985c fix bug: When we check the file is ended or not on SearchCodeSegmentDeclaration, we look up not the current lexer but the current file lexer.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 90
diff changeset
1051 else if(PP.getCurrentFileLexer() != L){
90
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1052 return false;
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1053 }
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1054
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1055 ConsumeAnyToken();
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1056 }
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1057 }
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1058
43
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
1059 #endif