10 #include <unordered_map>
13 #include <llvm/ADT/ilist.h>
14 #include <llvm/ADT/ilist_node.h>
15 #include <llvm/ADT/iterator_range.h>
17 #include "core/constant.h"
18 #include "core/expr.h"
19 #include "core/extern.h"
20 #include "core/symbol_table.h"
21 #include "core/data.h"
22 #include "core/object.h"
23 #include "core/func.h"
24 #include "core/xtor.h"
38 using DataListType = llvm::ilist<Data>;
42 using XtorListType = llvm::ilist<Xtor>;
45 using GlobalMap = std::unordered_map<std::string_view, Global *>;
48 :
public llvm::iterator_adaptor_base
51 , std::random_access_iterator_tag
56 explicit global_iterator(GlobalMap::iterator it)
57 : iterator_adaptor_base(it)
61 Global *operator*()
const {
return this->I->second; }
63 Global *operator->()
const {
return this->I->second; }
66 class const_global_iterator
67 :
public llvm::iterator_adaptor_base
68 < const_global_iterator
69 , GlobalMap::const_iterator
70 , std::random_access_iterator_tag
75 explicit const_global_iterator(GlobalMap::const_iterator it)
76 : iterator_adaptor_base(it)
80 const Global *operator*()
const {
return this->I->second; }
82 const Global *operator->()
const {
return this->I->second; }
88 using const_iterator = FuncListType::const_iterator;
92 using const_data_iterator = DataListType::const_iterator;
96 using const_ext_iterator = ExternListType::const_iterator;
100 using const_xtor_iterator = XtorListType::const_iterator;
104 Prog(std::string_view path);
120 const std::string &
GetName()
const {
return name_; }
122 llvm::StringRef
getName()
const {
return { name_.data(), name_.size() }; }
144 size_t size()
const {
return funcs_.size(); }
145 bool empty()
const {
return funcs_.empty(); }
146 iterator begin() {
return funcs_.begin(); }
147 iterator end() {
return funcs_.end(); }
148 const_iterator begin()
const {
return funcs_.begin(); }
149 const_iterator end()
const {
return funcs_.end(); }
150 llvm::iterator_range<const_iterator> funcs()
const;
151 llvm::iterator_range<iterator> funcs();
156 size_t ext_size()
const {
return externs_.size(); }
159 const_ext_iterator ext_begin()
const {
return externs_.begin(); }
160 const_ext_iterator ext_end()
const {
return externs_.end(); }
161 llvm::iterator_range<const_ext_iterator> externs()
const;
162 llvm::iterator_range<ext_iterator> externs();
167 size_t data_size()
const {
return datas_.size(); }
168 bool data_empty()
const {
return datas_.empty(); }
171 const_data_iterator data_begin()
const {
return datas_.begin(); }
172 const_data_iterator data_end()
const {
return datas_.end(); }
173 llvm::iterator_range<const_data_iterator> data()
const;
174 llvm::iterator_range<data_iterator> data();
179 size_t xtor_size()
const {
return xtors_.size(); }
180 bool xtor_empty()
const {
return xtors_.empty(); }
183 const_xtor_iterator xtor_begin()
const {
return xtors_.begin(); }
184 const_xtor_iterator xtor_end()
const {
return xtors_.end(); }
185 llvm::iterator_range<const_xtor_iterator> xtor()
const;
186 llvm::iterator_range<xtor_iterator> xtor();
189 global_iterator
global_begin() {
return global_iterator(globals_.begin()); }
190 global_iterator global_end() {
return global_iterator(globals_.end()); }
191 const_global_iterator
global_begin()
const {
return const_global_iterator(globals_.begin()); }
192 const_global_iterator global_end()
const {
return const_global_iterator(globals_.end()); }
193 llvm::iterator_range<global_iterator> globals();
194 llvm::iterator_range<const_global_iterator> globals()
const;
197 void dump(llvm::raw_ostream &os = llvm::errs())
const;
205 friend struct llvm::ilist_traits<
Data>;
206 friend struct llvm::ilist_traits<
Object>;
208 void insertGlobal(
Global *g);
209 void removeGlobalName(std::string_view name);
212 static ExternListType
Prog::*getSublistAccess(
Extern *) {
return &Prog::externs_; }
213 static DataListType
Prog::*getSublistAccess(
Data *) {
return &Prog::datas_; }
214 static XtorListType
Prog::*getSublistAccess(
Xtor *) {
return &Prog::xtors_; }
220 std::unordered_map<std::string_view, Global *> globals_;
226 ExternListType externs_;