41class ShadowGarbageCollector {
44 llvm::LLVMContext &context;
46 llvm::IRBuilder<> &builder;
47 std::vector<llvm::Constant *> MetaDataEntries;
52 std::map<std::string, llvm::GlobalVariable *> fn_name_to_frame_map;
53 inline static std::string GLOBAL_ROOT_CHAIN =
"global_root_chain";
54 inline static std::string FRAME_MAP =
"frame_map";
57 llvm::StructType *FRAME_MAP_TYPE;
58 llvm::StructType *STACK_ENTRY_TYPE;
59 ShadowGarbageCollector(
LLVMRes &resPtr)
60 : module(*resPtr.Module.get()), context(*resPtr.Context.get()),
61 builder(*resPtr.Builder) {
63 FRAME_MAP_TYPE = llvm::StructType::create(context,
"frame_map_type");
65 llvm::Type::getInt64Ty(context);
66 FRAME_MAP_TYPE->setBody(int64type);
69 STACK_ENTRY_TYPE = llvm::StructType::create(context,
"stack_entry_type");
70 llvm::PointerType *int64ptr =
71 llvm::PointerType::get(context, 0);
72 llvm::ArrayType *root_array = llvm::ArrayType::get(int64ptr, 0);
77 STACK_ENTRY_TYPE->setBody({int64ptr, int64ptr, root_array});
80 virtual std::string llvmStrategy() {
return "shadow-stack"; }
82 void applyStrategy(llvm::Function *f);
84 void relieveStackEntry();
93 llvm::LLVMContext &context;
94 llvm::IRBuilder<> &builder;
96 inline static std::string REFCNT_MALLOC_WRAPPER_NAME =
97 "refcnt_malloc_wrapper";
100 inline static constexpr int REFCNT_SIZE =
sizeof(int32_t);
101 void declare_refcnt_visitor(
bool is_main_file,
102 llvm::StructType *stack_entry_type,
103 llvm::StructType *frame_map_type);
104 void declare_malloc_wrapper(
bool is_main_file);
105 void decrease_refcnt(llvm::Value *);
106 void increase_refcnt(llvm::Value *);
108 : module(*resPtr.Module.get()), context(*resPtr.Context.get()),
109 builder(*resPtr.Builder) {}
Defined LLVMRes, which encapsulates the state of LLVM (Context, Modules, IRBuilder,...