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