11d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// Copyright 2015 Google Inc. All rights reserved 21d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// 31d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// Licensed under the Apache License, Version 2.0 (the "License"); 41d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// you may not use this file except in compliance with the License. 51d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// You may obtain a copy of the License at 61d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// 71d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// http://www.apache.org/licenses/LICENSE-2.0 81d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// 91d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// Unless required by applicable law or agreed to in writing, software 101d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// distributed under the License is distributed on an "AS IS" BASIS, 111d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 121d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// See the License for the specific language governing permissions and 131d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// limitations under the License. 141d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji 15776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#ifndef EVAL_H_ 16776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#define EVAL_H_ 17776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 18776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#include <unordered_map> 197e70801d6486d23c689366e1187abe34413c0670Shinichiro Hamaji#include <unordered_set> 20776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#include <vector> 21776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 22776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#include "loc.h" 23645cca7910dccf4811dbf65d4c83a068a83b48c9Shinichiro Hamaji#include "stmt.h" 24776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#include "string_piece.h" 25e7992752dbfe23d0a88312b4279531c39512b9a6Shinichiro Hamaji#include "symtab.h" 26776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 27776ca3085c44e6570813270df75278849c37d400Shinichiro Hamajiusing namespace std; 28776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 29776ca3085c44e6570813270df75278849c37d400Shinichiro Hamajiclass Makefile; 30776ca3085c44e6570813270df75278849c37d400Shinichiro Hamajiclass Rule; 31776ca3085c44e6570813270df75278849c37d400Shinichiro Hamajiclass Var; 32776ca3085c44e6570813270df75278849c37d400Shinichiro Hamajiclass Vars; 33776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 34776ca3085c44e6570813270df75278849c37d400Shinichiro Hamajiclass Evaluator { 35776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji public: 36c9b9e5eea8b477a103cdec951ef2a299f9cd49baShinichiro Hamaji Evaluator(); 37776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji ~Evaluator(); 38776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 39645cca7910dccf4811dbf65d4c83a068a83b48c9Shinichiro Hamaji void EvalAssign(const AssignStmt* stmt); 40645cca7910dccf4811dbf65d4c83a068a83b48c9Shinichiro Hamaji void EvalRule(const RuleStmt* stmt); 41645cca7910dccf4811dbf65d4c83a068a83b48c9Shinichiro Hamaji void EvalCommand(const CommandStmt* stmt); 42645cca7910dccf4811dbf65d4c83a068a83b48c9Shinichiro Hamaji void EvalIf(const IfStmt* stmt); 43645cca7910dccf4811dbf65d4c83a068a83b48c9Shinichiro Hamaji void EvalInclude(const IncludeStmt* stmt); 44645cca7910dccf4811dbf65d4c83a068a83b48c9Shinichiro Hamaji void EvalExport(const ExportStmt* stmt); 45776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 46e7992752dbfe23d0a88312b4279531c39512b9a6Shinichiro Hamaji Var* LookupVar(Symbol name); 47776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji // For target specific variables. 48e7992752dbfe23d0a88312b4279531c39512b9a6Shinichiro Hamaji Var* LookupVarInCurrentScope(Symbol name); 4994d6f2a2843a3da25498e2692b137e1f222931c8Shinichiro Hamaji 50fb415ad2b0835e251b4d5cb5a8397b80c41525d6Shinichiro Hamaji string EvalVar(Symbol name); 51776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 529619b36d9d833d7b3ba77b8100944cdc9cc85de0Shinichiro Hamaji const Loc& loc() const { return loc_; } 5386e113342a49499850701e3b752ce56ec73d34d6Shinichiro Hamaji void set_loc(const Loc& loc) { loc_ = loc; } 549619b36d9d833d7b3ba77b8100944cdc9cc85de0Shinichiro Hamaji 557a2659e0650ca265c44a654732efd69404d6585aShinichiro Hamaji const vector<const Rule*>& rules() const { return rules_; } 56e7992752dbfe23d0a88312b4279531c39512b9a6Shinichiro Hamaji const unordered_map<Symbol, Vars*>& rule_vars() const { 57ffc52c3c5bed9d696d0296c1674d2e75460bef40Shinichiro Hamaji return rule_vars_; 58ffc52c3c5bed9d696d0296c1674d2e75460bef40Shinichiro Hamaji } 59e7992752dbfe23d0a88312b4279531c39512b9a6Shinichiro Hamaji const unordered_map<Symbol, bool>& exports() const { return exports_; } 60776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 619619b36d9d833d7b3ba77b8100944cdc9cc85de0Shinichiro Hamaji void Error(const string& msg); 629619b36d9d833d7b3ba77b8100944cdc9cc85de0Shinichiro Hamaji 630e74c5452987d20abedf03452183aafc7f3059ecShinichiro Hamaji void set_is_bootstrap(bool b) { is_bootstrap_ = b; } 641c3a69502c86c2c32223a267c5bf49db80b55f47Shinichiro Hamaji void set_is_commandline(bool c) { is_commandline_ = c; } 650e74c5452987d20abedf03452183aafc7f3059ecShinichiro Hamaji 66ffc52c3c5bed9d696d0296c1674d2e75460bef40Shinichiro Hamaji void set_current_scope(Vars* v) { current_scope_ = v; } 67ffc52c3c5bed9d696d0296c1674d2e75460bef40Shinichiro Hamaji 68df1fc8b2ead00bad8c23065affb9576a4b03cff5Shinichiro Hamaji bool avoid_io() const { return avoid_io_; } 69df1fc8b2ead00bad8c23065affb9576a4b03cff5Shinichiro Hamaji void set_avoid_io(bool a) { avoid_io_ = a; } 70df1fc8b2ead00bad8c23065affb9576a4b03cff5Shinichiro Hamaji 7186e113342a49499850701e3b752ce56ec73d34d6Shinichiro Hamaji const vector<string>& delayed_output_commands() const { 7286e113342a49499850701e3b752ce56ec73d34d6Shinichiro Hamaji return delayed_output_commands_; 7386e113342a49499850701e3b752ce56ec73d34d6Shinichiro Hamaji } 7486e113342a49499850701e3b752ce56ec73d34d6Shinichiro Hamaji void add_delayed_output_command(const string& c) { 7586e113342a49499850701e3b752ce56ec73d34d6Shinichiro Hamaji delayed_output_commands_.push_back(c); 7686e113342a49499850701e3b752ce56ec73d34d6Shinichiro Hamaji } 7786e113342a49499850701e3b752ce56ec73d34d6Shinichiro Hamaji void clear_delayed_output_commands() { 7886e113342a49499850701e3b752ce56ec73d34d6Shinichiro Hamaji delayed_output_commands_.clear(); 7986e113342a49499850701e3b752ce56ec73d34d6Shinichiro Hamaji } 8086e113342a49499850701e3b752ce56ec73d34d6Shinichiro Hamaji 817e70801d6486d23c689366e1187abe34413c0670Shinichiro Hamaji static const unordered_set<Symbol>& used_undefined_vars() { 827e70801d6486d23c689366e1187abe34413c0670Shinichiro Hamaji return used_undefined_vars_; 837e70801d6486d23c689366e1187abe34413c0670Shinichiro Hamaji } 847e70801d6486d23c689366e1187abe34413c0670Shinichiro Hamaji 8528da2379c3b819088f0a503fcd0bfdd27ab40879Shinichiro Hamaji int eval_depth() const { return eval_depth_; } 8628da2379c3b819088f0a503fcd0bfdd27ab40879Shinichiro Hamaji void IncrementEvalDepth() { 8728da2379c3b819088f0a503fcd0bfdd27ab40879Shinichiro Hamaji eval_depth_++; 8828da2379c3b819088f0a503fcd0bfdd27ab40879Shinichiro Hamaji } 8928da2379c3b819088f0a503fcd0bfdd27ab40879Shinichiro Hamaji void DecrementEvalDepth() { 9028da2379c3b819088f0a503fcd0bfdd27ab40879Shinichiro Hamaji eval_depth_--; 9128da2379c3b819088f0a503fcd0bfdd27ab40879Shinichiro Hamaji } 9228da2379c3b819088f0a503fcd0bfdd27ab40879Shinichiro Hamaji 932941ea07651737a6151b19db45c010d2083dfa1dShinichiro Hamaji string GetShell(); 942941ea07651737a6151b19db45c010d2083dfa1dShinichiro Hamaji string GetShellFlag(); 952941ea07651737a6151b19db45c010d2083dfa1dShinichiro Hamaji string GetShellAndFlag(); 962941ea07651737a6151b19db45c010d2083dfa1dShinichiro Hamaji 97776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji private: 98e7992752dbfe23d0a88312b4279531c39512b9a6Shinichiro Hamaji Var* EvalRHS(Symbol lhs, Value* rhs, StringPiece orig_rhs, AssignOp op, 99420f7754d973242d4120ed67a942bfb386706494Shinichiro Hamaji bool is_override = false); 1000e3873a2bed37cc4668919184cf338af80740cc5Shinichiro Hamaji void DoInclude(const string& fname); 1016e6de8d721166b90b017a88c44a9cca0afadf921Shinichiro Hamaji 1027e70801d6486d23c689366e1187abe34413c0670Shinichiro Hamaji Var* LookupVarGlobal(Symbol name); 1037e70801d6486d23c689366e1187abe34413c0670Shinichiro Hamaji 104e7992752dbfe23d0a88312b4279531c39512b9a6Shinichiro Hamaji unordered_map<Symbol, Vars*> rule_vars_; 1057a2659e0650ca265c44a654732efd69404d6585aShinichiro Hamaji vector<const Rule*> rules_; 106e7992752dbfe23d0a88312b4279531c39512b9a6Shinichiro Hamaji unordered_map<Symbol, bool> exports_; 10745a0c76779c3ea40bce4af89c039f8d853cd2d43Shinichiro Hamaji 108776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji Rule* last_rule_; 109784b99578e2a0b160721bebcbd0706bbf5e99f4cShinichiro Hamaji Vars* current_scope_; 110776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 111776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji Loc loc_; 1120e74c5452987d20abedf03452183aafc7f3059ecShinichiro Hamaji bool is_bootstrap_; 1131c3a69502c86c2c32223a267c5bf49db80b55f47Shinichiro Hamaji bool is_commandline_; 11486e113342a49499850701e3b752ce56ec73d34d6Shinichiro Hamaji 115df1fc8b2ead00bad8c23065affb9576a4b03cff5Shinichiro Hamaji bool avoid_io_; 11628da2379c3b819088f0a503fcd0bfdd27ab40879Shinichiro Hamaji // This value tracks the nest level of make expressions. For 11728da2379c3b819088f0a503fcd0bfdd27ab40879Shinichiro Hamaji // example, $(YYY) in $(XXX $(YYY)) is evaluated with depth==2. 11828da2379c3b819088f0a503fcd0bfdd27ab40879Shinichiro Hamaji // This will be used to disallow $(shell) in other make constructs. 11928da2379c3b819088f0a503fcd0bfdd27ab40879Shinichiro Hamaji int eval_depth_; 12086e113342a49499850701e3b752ce56ec73d34d6Shinichiro Hamaji // Commands which should run at ninja-time (i.e., info, warning, and 12186e113342a49499850701e3b752ce56ec73d34d6Shinichiro Hamaji // error). 12286e113342a49499850701e3b752ce56ec73d34d6Shinichiro Hamaji vector<string> delayed_output_commands_; 1237e70801d6486d23c689366e1187abe34413c0670Shinichiro Hamaji 1242941ea07651737a6151b19db45c010d2083dfa1dShinichiro Hamaji Symbol posix_sym_; 1252941ea07651737a6151b19db45c010d2083dfa1dShinichiro Hamaji bool is_posix_; 1262941ea07651737a6151b19db45c010d2083dfa1dShinichiro Hamaji 1277e70801d6486d23c689366e1187abe34413c0670Shinichiro Hamaji static unordered_set<Symbol> used_undefined_vars_; 128f87d49e41a5dd57733d02f3990c91dc38e557dadDan Willemsen 129f87d49e41a5dd57733d02f3990c91dc38e557dadDan Willemsen Symbol kati_readonly_; 130776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji}; 131776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 132776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#endif // EVAL_H_ 133