diff options
-rw-r--r-- | include/flang/Basic/Actions.h | 2 | ||||
-rw-r--r-- | include/flang/Parse/Parser.h | 11 | ||||
-rw-r--r-- | include/flang/Sema/Sema.h | 48 | ||||
-rw-r--r-- | lib/Basic/Actions.cpp | 14 | ||||
-rw-r--r-- | lib/Parse/ParseDecl.cpp | 2 | ||||
-rw-r--r-- | lib/Parse/ParseExec.cpp | 2 | ||||
-rw-r--r-- | lib/Parse/ParseExpr.cpp | 2 | ||||
-rw-r--r-- | lib/Parse/Parser.cpp | 16 | ||||
-rw-r--r-- | lib/Sema/Sema.cpp | 23 | ||||
-rw-r--r-- | tools/driver/Main.cpp | 8 | ||||
-rw-r--r-- | tools/driver/Makefile | 2 |
11 files changed, 97 insertions, 33 deletions
diff --git a/include/flang/Basic/Actions.h b/include/flang/Basic/Actions.h index 1985fce6db..689f2dd427 100644 --- a/include/flang/Basic/Actions.h +++ b/include/flang/Basic/Actions.h @@ -41,6 +41,7 @@ public: virtual ~Action(); virtual void ActOnTranslationUnit() = 0; virtual void ActOnMainProgram(const DeclarationNameInfo &NameInfo) = 0; + virtual void ActOneEndMainProgram(const DeclarationNameInfo &EndNameInfo) = 0; virtual void ActOnEndProgramUnit() = 0; virtual StmtResult ActOnPROGRAM(ASTContext &C, const IdentifierInfo *ProgName, @@ -91,6 +92,7 @@ public: PrintAction(Diagnostic &D) : Diag(D), Indent(0) {} virtual void ActOnTranslationUnit(); virtual void ActOnMainProgram(const DeclarationNameInfo &NameInfo); + virtual void ActOneEndMainProgram(const DeclarationNameInfo &EndNameInfo); virtual void ActOnEndProgramUnit(); virtual StmtResult ActOnPROGRAM(ASTContext &C, const IdentifierInfo *ProgName, diff --git a/include/flang/Parse/Parser.h b/include/flang/Parse/Parser.h index 5789c96070..cf09619d2e 100644 --- a/include/flang/Parse/Parser.h +++ b/include/flang/Parse/Parser.h @@ -38,6 +38,7 @@ class DeclGroupRef; class Expr; class Parser; class Selector; +class Sema; /// PrettyStackTraceParserEntry - If a crash happens while the parser is active, /// an entry is printed for it. @@ -68,19 +69,19 @@ private: /// SourceMgr object. int CurBuffer; - ASTContext Context; // FIXME: Move to AST construction. + ASTContext &Context; /// Diag - Diagnostics for parsing errors. Diagnostic &Diag; -#if 0 /// Actions - These are the callbacks we invoke as we parse various constructs /// in the file. Sema &Actions; -#endif +#if 0 /// Actions - These are the callbacks we invoke as we parse various constructs /// in the file. Action &Actions; +#endif /// Tok - The current token we are parsing. All parsing methods assume that /// this is valid. @@ -139,8 +140,12 @@ public: return Identifiers.isaBuiltin(BI); } +#if 0 Parser(llvm::SourceMgr &SrcMgr, const LangOptions &Opts, Diagnostic &D, Action &Acts); +#endif + Parser(llvm::SourceMgr &SrcMgr, const LangOptions &Opts, + Diagnostic &D, Sema &actions); llvm::SourceMgr &getSourceManager() { return SrcMgr; } diff --git a/include/flang/Sema/Sema.h b/include/flang/Sema/Sema.h index 0ae83bd237..02128ba6a6 100644 --- a/include/flang/Sema/Sema.h +++ b/include/flang/Sema/Sema.h @@ -16,18 +16,25 @@ #define FLANG_SEMA_SEMA_H__ #include "flang/Basic/Token.h" +#include "flang/AST/Stmt.h" +#include "flang/AST/Type.h" #include "flang/Sema/Ownership.h" +#include "llvm/ADT/StringRef.h" #include "llvm/Support/SourceMgr.h" #include "llvm/Support/SMLoc.h" +#include "flang/Basic/LLVM.h" namespace flang { class ASTContext; class DeclContext; +class DeclSpec; class DeclarationNameInfo; +class Diagnostic; class Expr; class IdentifierInfo; class Token; +class VarDecl; /// Sema - This implements semantic analysis and AST buiding for Fortran. class Sema { @@ -37,12 +44,12 @@ public: typedef Expr ExprTy; ASTContext &Context; - llvm::SourceMgr &SrcMgr; + Diagnostic &Diags; /// CurContext - This is the current declaration context of parsing. DeclContext *CurContext; - Sema(ASTContext &ctxt, llvm::SourceMgr &sm); + Sema(ASTContext &ctxt, Diagnostic &Diags); ~Sema(); DeclContext *getContainingDC(DeclContext *DC); @@ -52,9 +59,10 @@ public: void PopDeclContext(); void ActOnTranslationUnit(); - void ActOnMainProgram(const DeclarationNameInfo &NameInfo); void ActOnEndProgramUnit(); + void ActOnMainProgram(const DeclarationNameInfo &NameInfo); + void ActOnEndMainProgram(const DeclarationNameInfo &EndNameInfo); StmtResult ActOnPROGRAM(ASTContext &C, const IdentifierInfo *ProgName, llvm::SMLoc Loc, llvm::SMLoc NameLoc, @@ -63,6 +71,40 @@ public: const IdentifierInfo *ProgName, llvm::SMLoc Loc, llvm::SMLoc NameLoc, Token StmtLabel); + + // FIXME: TODO: + + StmtResult ActOnIMPORT(llvm::ArrayRef<IdentifierInfo*>, + Token &StmtLabel) { return StmtResult(); } + StmtResult ActOnIMPLICIT(Token &StmtLabel) { return StmtResult(); } + StmtResult ActOnUSE(UseStmt::ModuleNature MN, llvm::StringRef Name, + bool OnlyList, + llvm::ArrayRef<const VarDecl*> LocalNames, + llvm::ArrayRef<const VarDecl*> UseNames, + Token &StmtLabel) { return StmtResult(); } + StmtResult + ActOnPARAMETER(llvm::ArrayRef<const IdentifierInfo*> NamedConsts, + llvm::ArrayRef<ExprResult> ConstExprs, + Token &StmtLabel) { return StmtResult(); } + StmtResult + ActOnASYNCHRONOUS(llvm::ArrayRef<const IdentifierInfo*> ObjNames, + Token &StmtLabel) { return StmtResult(); } + + QualType ActOnBuiltinType(ASTContext *Ctx, + BuiltinType::TypeSpec TS, + Expr *Kind) { return QualType(); } + QualType ActOnCharacterBuiltinType(ASTContext *Ctx, + Expr *Len, + Expr *Kind) { return QualType(); } + DeclSpec *ActOnTypeDeclSpec(ASTContext *Ctx) { return 0; } + Decl *ActOnVarDecl(ASTContext *Ctx, DeclSpec *DTS, + const VarDecl *VD) { return 0; } + + bool ActOnArraySpec() { return false; } + + ExprResult ActOnDataReference(llvm::ArrayRef<ExprResult> Exprs) { + return ExprResult(); + } }; } // end flang namespace diff --git a/lib/Basic/Actions.cpp b/lib/Basic/Actions.cpp index 93a4f1dbaa..6895a43e91 100644 --- a/lib/Basic/Actions.cpp +++ b/lib/Basic/Actions.cpp @@ -39,6 +39,8 @@ Action::~Action() { void PrintAction::ActOnTranslationUnit() {} void PrintAction::ActOnEndProgramUnit() {} void PrintAction::ActOnMainProgram(const DeclarationNameInfo &NameInfo) {} +void PrintAction::ActOneEndMainProgram(const DeclarationNameInfo &EndNameInfo) { +} StmtResult PrintAction::ActOnPROGRAM(ASTContext &C, const IdentifierInfo *ProgName, @@ -59,18 +61,6 @@ StmtResult PrintAction::ActOnENDPROGRAM(ASTContext &C, llvm::SMLoc Loc, llvm::SMLoc NameLoc, Token &StmtLabel) { Indent = 0; - - // This name, if specified, must match the name specified on the 'PROGRAM' - // statement. - llvm::StringRef Name = (ProgName ? ProgName->getName() : ""); - if (Name.size() != 0 && ProgName != ProgramName) { - // FIXME: Use a real error reporting mechanism here. - Diag.ReportError(Loc, llvm::Twine("expected label '") + - ProgramName->getName() + - "' for END PROGRAM statement"); - return StmtResult(); - } - llvm::outs() << "</program"; PrintStmtLabel(StmtLabel); llvm::outs() << ">\n"; diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index 1e4bf45e40..e08b6a3e43 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -14,7 +14,7 @@ #include "flang/Parse/Parser.h" #include "flang/AST/Decl.h" #include "flang/AST/Expr.h" -#include "flang/Basic/Actions.h" +#include "flang/Sema/Sema.h" using namespace flang; /// AssignAttrSpec - Helper function that assigns the attribute specification to diff --git a/lib/Parse/ParseExec.cpp b/lib/Parse/ParseExec.cpp index fee5f3c89f..4ba64691ae 100644 --- a/lib/Parse/ParseExec.cpp +++ b/lib/Parse/ParseExec.cpp @@ -15,9 +15,9 @@ #include "flang/AST/Decl.h" #include "flang/AST/Expr.h" #include "flang/AST/Stmt.h" -#include "flang/Basic/Actions.h" #include "flang/Basic/DeclSpec.h" #include "flang/Basic/TokenKinds.h" +#include "flang/Sema/Sema.h" #include "llvm/Support/SourceMgr.h" #include "llvm/Support/raw_ostream.h" using namespace flang; diff --git a/lib/Parse/ParseExpr.cpp b/lib/Parse/ParseExpr.cpp index 1ad55a11cf..55666d232e 100644 --- a/lib/Parse/ParseExpr.cpp +++ b/lib/Parse/ParseExpr.cpp @@ -14,8 +14,8 @@ #include "flang/Parse/Parser.h" #include "flang/AST/Decl.h" #include "flang/AST/Expr.h" -#include "flang/Basic/Actions.h" #include "flang/Sema/Ownership.h" +#include "flang/Sema/Sema.h" #include "llvm/Support/SourceMgr.h" #include "llvm/ADT/Twine.h" using namespace flang; diff --git a/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp index ff3d7b4ccd..7c7b978f85 100644 --- a/lib/Parse/Parser.cpp +++ b/lib/Parse/Parser.cpp @@ -15,9 +15,9 @@ #include "flang/AST/Decl.h" #include "flang/AST/Expr.h" #include "flang/AST/Stmt.h" -#include "flang/Basic/Actions.h" #include "flang/Basic/DeclSpec.h" #include "flang/Basic/TokenKinds.h" +#include "flang/Sema/Sema.h" #include "llvm/Support/SourceMgr.h" #include "llvm/Support/raw_ostream.h" #include "llvm/ADT/APInt.h" @@ -61,9 +61,10 @@ void PrettyStackTraceParserEntry::print(llvm::raw_ostream &OS) const { //===----------------------------------------------------------------------===// Parser::Parser(llvm::SourceMgr &SM, const LangOptions &Opts, Diagnostic &D, - Action &Acts) + Sema &actions) : TheLexer(SM, Opts, D), Features(Opts), CrashInfo(*this), SrcMgr(SM), - CurBuffer(0), Context(SM), Diag(D), Actions(Acts), Identifiers(Opts) { + CurBuffer(0), Context(actions.Context), Diag(D), Actions(actions), + Identifiers(Opts) { getLexer().setBuffer(SrcMgr.getMemoryBuffer(CurBuffer)); Tok.startToken(); NextTok.startToken(); @@ -304,11 +305,14 @@ bool Parser::ParseMainProgram() { ParseStatementLabel(); } + // If the PROGRAM statement has an identifier, create a DeclarationNameInfo + // object for the main-program action. const IdentifierInfo *IDInfo = 0; llvm::SMLoc NameLoc; if (ProgStmt.isUsable()) { - IDInfo = ProgStmt.takeAs<ProgramStmt>()->getProgramName(); - NameLoc = ProgStmt.takeAs<ProgramStmt>()->getNameLocation(); + ProgramStmt *PS = ProgStmt.takeAs<ProgramStmt>(); + IDInfo = PS->getProgramName(); + NameLoc = PS->getNameLocation(); } DeclarationName DN(IDInfo); @@ -325,7 +329,7 @@ bool Parser::ParseMainProgram() { ParseStatementLabel(); } - ParseEND_PROGRAMStmt(); + StmtResult EndProgStmt = ParseEND_PROGRAMStmt(); Actions.ActOnEndProgramUnit(); return false; diff --git a/lib/Sema/Sema.cpp b/lib/Sema/Sema.cpp index 25bc34be0d..64d9ad4098 100644 --- a/lib/Sema/Sema.cpp +++ b/lib/Sema/Sema.cpp @@ -16,10 +16,11 @@ #include "flang/AST/ASTContext.h" #include "flang/AST/Decl.h" #include "flang/AST/Stmt.h" +#include "flang/Basic/Diagnostic.h" using namespace flang; -Sema::Sema(ASTContext &ctxt, llvm::SourceMgr &sm) - : Context(ctxt), SrcMgr(sm), CurContext(0) {} +Sema::Sema(ASTContext &ctxt, Diagnostic &D) + : Context(ctxt), Diags(D), CurContext(0) {} Sema::~Sema() {} @@ -46,13 +47,29 @@ void Sema::ActOnTranslationUnit() { PushDeclContext(Context.getTranslationUnitDecl()); } +void Sema::ActOnEndProgramUnit() { + PopDeclContext(); +} + void Sema::ActOnMainProgram(const DeclarationNameInfo &NameInfo) { PushDeclContext(MainProgramDecl::Create(Context, Context.getTranslationUnitDecl(), NameInfo)); } -void Sema::ActOnEndProgramUnit() { +void Sema::ActOnEndMainProgram(const DeclarationNameInfo &EndNameInfo) { + assert(CurContext && "DeclContext imbalance!"); + StringRef ProgName = cast<MainProgramDecl>(CurContext)->getName(); + if (ProgName.empty()) return; + + const IdentifierInfo *ID = EndNameInfo.getName().getAsIdentifierInfo(); + if (!ID) return; + + if (ProgName != ID->getName()) + Diags.ReportError(EndNameInfo.getLoc(), + llvm::Twine("expected label '") + + ProgName + "' for END PROGRAM statement"); + PopDeclContext(); } diff --git a/tools/driver/Main.cpp b/tools/driver/Main.cpp index a240ccc913..91ff99cc70 100644 --- a/tools/driver/Main.cpp +++ b/tools/driver/Main.cpp @@ -11,9 +11,9 @@ // //===----------------------------------------------------------------------===// -#include "flang/Basic/Actions.h" #include "flang/Frontend/TextDiagnosticPrinter.h" #include "flang/Parse/Parser.h" +#include "flang/Sema/Sema.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/MemoryBuffer.h" @@ -78,8 +78,12 @@ static bool ParseFile(const std::string &Filename, Opts.ReturnComments = ReturnComments; TextDiagnosticPrinter TDP(SrcMgr); Diagnostic Diag(&SrcMgr, &TDP, false); +#if 0 PrintAction PA(Diag); - Parser P(SrcMgr, Opts, Diag, PA); +#endif + ASTContext Context(SrcMgr); + Sema SA(Context, Diag); + Parser P(SrcMgr, Opts, Diag, SA); return P.ParseProgramUnits(); } diff --git a/tools/driver/Makefile b/tools/driver/Makefile index b2b28bacda..e0e22e0835 100644 --- a/tools/driver/Makefile +++ b/tools/driver/Makefile @@ -31,7 +31,7 @@ include $(FLANG_LEVEL)/../../Makefile.config LINK_COMPONENTS := $(TARGETS_TO_BUILD) asmparser bitreader bitwriter codegen \ ipo selectiondag -USEDLIBS = flangAST.a flangFrontend.a flangParse.a flangBasic.a +USEDLIBS = flangAST.a flangFrontend.a flangParse.a flangSema.a flangBasic.a include $(FLANG_LEVEL)/Makefile |