llir-opt
0.0.1
Low-Level Post-Link Optimiser for OCaml and C
|
9 #include <unordered_map>
10 #include <unordered_set>
13 #include <llvm/Support/raw_ostream.h>
15 #include "core/adt/id.h"
16 #include "core/adt/hash.h"
17 #include "core/adt/bitset.h"
35 enum class Kind : uint8_t {
165 : v_(*arg.second, arg.first->first)
176 : v_(arg->first, arg->second)
205 const AddrObjectRange &AsObjectRange()
const {
return v_.OR; }
206 const AddrExtern &AsExtern()
const {
return v_.E; }
207 const AddrExternRange &AsExternRange()
const {
return v_.ER; }
208 const AddrFunc &AsFunc()
const {
return v_.F; }
209 const AddrBlock &AsBlock()
const {
return v_.B; }
210 const AddrStack &AsStack()
const {
return v_.S; }
218 return v_.K == Kind::OBJECT ? &v_.O :
nullptr;
224 return v_.K == Kind::OBJECT_RANGE ? &v_.OR :
nullptr;
231 void dump(llvm::raw_ostream &os)
const;
248 P(
Extern *symbol, int64_t off) : E(symbol, off) { }
249 P(
Extern *symbol) : ER(symbol) { }
252 P(
Block *block) : B(block) { }
258 inline llvm::raw_ostream &operator<<(
259 llvm::raw_ostream &os,
272 using Ref = std::shared_ptr<SymbolicPointer>;
274 using ObjectMap = std::unordered_map<int64_t, BitSet<SymbolicObject>>;
276 using ExternMap = std::unordered_map<Extern *, int64_t>;
277 using ExternRangeMap = std::unordered_set<Extern *>;
279 using BlockMap = std::unordered_set<Block *>;
283 < std::forward_iterator_tag
290 template <
typename It>
300 return current_ == that.current_;
304 return !(*
this == that);
322 std::optional<SymbolicAddress> current_;
324 std::optional<std::variant<
325 std::pair<ObjectMap::const_iterator, BitSet<SymbolicObject>::iterator>,
326 ObjectRangeMap::iterator,
327 ExternMap::const_iterator,
328 ExternRangeMap::const_iterator,
330 BlockMap::const_iterator,
335 using func_iterator = FuncMap::iterator;
336 using block_iterator = BlockMap::const_iterator;
337 using stack_iterator = StackMap::iterator;
383 Ref lub = std::make_shared<SymbolicPointer>(*
this);
389 void dump(llvm::raw_ostream &os)
const;
394 address_iterator
begin()
const;
395 address_iterator end()
const {
return address_iterator(); }
399 func_iterator func_begin()
const {
return funcPointers_.
begin(); }
400 func_iterator func_end()
const {
return funcPointers_.
end(); }
401 llvm::iterator_range<func_iterator> funcs()
const
403 return llvm::make_range(func_begin(), func_end());
407 size_t block_size()
const {
return std::distance(block_begin(), block_end()); }
408 block_iterator block_begin()
const {
return blockPointers_.begin(); }
409 block_iterator block_end()
const {
return blockPointers_.end(); }
410 llvm::iterator_range<block_iterator> blocks()
const
412 return llvm::make_range(block_begin(), block_end());
417 stack_iterator stack_begin()
const {
return stackPointers_.
begin(); }
418 stack_iterator stack_end()
const {
return stackPointers_.
end(); }
419 llvm::iterator_range<stack_iterator> stacks()
const
421 return llvm::make_range(stack_begin(), stack_end());
425 friend class address_iterator;
427 ObjectMap objectPointers_;
429 ObjectRangeMap objectRanges_;
431 ExternMap externPointers_;
433 ExternRangeMap externRanges_;
435 FuncMap funcPointers_;
437 BlockMap blockPointers_;
439 StackMap stackPointers_;
443 inline llvm::raw_ostream &operator<<(
444 llvm::raw_ostream &os,
ID< SymbolicObject > Object
Object symbol.
Definition: symbolic_pointer.h:51
Kind K
Kind of the symbol.
Definition: symbolic_pointer.h:149
Kind K
Kind of the symbol.
Definition: symbolic_pointer.h:104
SymbolicAddress(std::unordered_set< Block * >::const_iterator block)
Constructs an address to a block.
Definition: symbolic_pointer.h:190
Definition: symbolic_pointer.h:270
size_t func_size() const
Iterator over functions.
Definition: symbolic_pointer.h:398
size_t Size() const
Returns the size of the document.
Definition: bitset.h:516
SymbolicAddress(std::unordered_set< Extern * >::const_iterator arg)
Construct an address to a specific location.
Definition: symbolic_pointer.h:180
const AddrObjectRange * ToObjectRange() const
Attempt to convert to a global.
Definition: symbolic_pointer.h:222
Extern * Symbol
Extern symbol.
Definition: symbolic_pointer.h:106
void Add(ID< SymbolicFrame > frame)
Adds a stack frame to the pointer.
Definition: symbolic_pointer.h:366
size_t stack_size() const
Iterator over stacks.
Definition: symbolic_pointer.h:416
iterator begin() const
Start iterator.
Definition: bitset.h:356
bool operator==(const SymbolicAddress &that) const
Compares two sets of pointers for equality.
Definition: symbolic_pointer.cpp:16
void Add(ID< Func > f)
Add a function to the pointer.
Definition: symbolic_pointer.h:360
size_t block_size() const
Iterator over blocks.
Definition: symbolic_pointer.h:407
void Add(const BitSet< SymbolicFrame > &frames)
Add a range of stack pointers.
Definition: symbolic_pointer.h:368
Kind
Enumeration of address kinds.
Definition: symbolic_pointer.h:35
Definition: symbolic_object.h:26
Kind K
Kind of the symbol.
Definition: symbolic_pointer.h:49
const AddrObject * ToObject() const
Attempt to convert to a global.
Definition: symbolic_pointer.h:216
Definition: symbolic_pointer.h:282
iterator end() const
End iterator.
Definition: bitset.h:362
Range of an entire object.
Definition: symbolic_pointer.h:101
bool IsPrecise() const
Checks whether the pointer is precise.
Definition: symbolic_pointer.cpp:85
address_iterator begin() const
Iterator over pointers contained in the set.
Definition: symbolic_pointer.cpp:472
void Add(Block *b)
Adds a block to the pointer.
Definition: symbolic_pointer.h:364
Block * B
Pointer to the function.
Definition: symbolic_pointer.h:137
Pointer to a function.
Definition: symbolic_pointer.h:118
SymbolicAddress(const std::pair< std::unordered_map< int64_t, BitSet< SymbolicObject >>::const_iterator, BitSet< SymbolicObject >::iterator > &arg)
Construct an address to a specific location.
Definition: symbolic_pointer.h:161
Kind K
Kind of the symbol.
Definition: symbolic_pointer.h:85
Extern * Symbol
Extern symbol.
Definition: symbolic_pointer.h:87
const AddrObject & AsObject() const
Access the actual pointer kind.
Definition: symbolic_pointer.h:204
ID< Func > F
Pointer to the function.
Definition: symbolic_pointer.h:123
void dump(llvm::raw_ostream &os) const
Prints the address.
Definition: symbolic_pointer.cpp:49
bool empty() const
Checks whether the pointer points to anything.
Definition: symbolic_pointer.h:392
Ref LUB(const Ref &that) const
Computes the least-upper-bound.
Definition: symbolic_pointer.h:381
void Add(const BitSet< SymbolicObject > &range)
Add a range of pointers.
Definition: symbolic_pointer.h:370
SymbolicAddress(BitSet< SymbolicFrame >::iterator stack)
Constructs an address to a stack frame.
Definition: symbolic_pointer.h:195
ID< SymbolicObject > Object
Object symbol.
Definition: symbolic_pointer.h:70
void Add(ID< SymbolicObject > object)
Add a global to the pointer.
Definition: symbolic_pointer.h:352
bool Insert(const ID< T > &item)
Inserts an item into the bitset.
Definition: bitset.h:391
SymbolicAddress(BitSet< Func >::iterator func)
Constructs an address to a frame object.
Definition: symbolic_pointer.h:185
Kind K
Kind of the symbol.
Definition: symbolic_pointer.h:135
Kind K
Kind of the symbol.
Definition: symbolic_pointer.h:121
Kind K
Kind of the symbol.
Definition: symbolic_pointer.h:68
bool operator==(const SymbolicPointer &that) const
Compares two sets of pointers for equality.
Definition: symbolic_pointer.cpp:500
Definition: symbolic_frame.h:29
Ref Offset(int64_t offset) const
Offset the pointer.
Definition: symbolic_pointer.cpp:326
int64_t Offset
Offset into the symbol.
Definition: symbolic_pointer.h:89
Kind GetKind() const
Returns the address kind.
Definition: symbolic_pointer.h:201
Exact object address.
Definition: symbolic_pointer.h:46
Pointer to a stack frame.
Definition: symbolic_pointer.h:146
SymbolicAddress(BitSet< SymbolicObject >::iterator arg)
Construct an address to a specific location.
Definition: symbolic_pointer.h:170
unsigned Union(const BitSet &that)
Definition: bitset.h:434
void Merge(const Ref &that)
Computes the least-upper-bound in place.
Definition: symbolic_pointer.cpp:358
Ref Decay() const
Decays the pointer to ranges.
Definition: symbolic_pointer.cpp:342
int64_t Offset
Offset into the symbol.
Definition: symbolic_pointer.h:53
Pointer to a block.
Definition: symbolic_pointer.h:132
void Add(Extern *e)
Adds an extern to the pointer.
Definition: symbolic_pointer.h:358
void dump(llvm::raw_ostream &os) const
Dump the textual representation to a stream.
Definition: symbolic_pointer.cpp:454
SymbolicAddress(std::unordered_map< Extern *, int64_t >::const_iterator arg)
Construct an address to a specific location.
Definition: symbolic_pointer.h:175
void Add(const BitSet< Func > &funcs)
Add a range of functions to the pointer.
Definition: symbolic_pointer.h:362
Definition: symbolic_pointer.h:32
Exact external address.
Definition: symbolic_pointer.h:82
ID< SymbolicFrame > Frame
Index of the frame.
Definition: symbolic_pointer.h:151
Range of an entire object.
Definition: symbolic_pointer.h:65