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";
56 llvm::StructType *FRAME_MAP_TYPE;
57 llvm::StructType *STACK_ENTRY_TYPE;
60 ShadowGarbageCollector(
LLVMRes &resPtr)
61 : module(*resPtr.Module.get()), context(*resPtr.Context.get()),
62 builder(*resPtr.Builder) {
64 FRAME_MAP_TYPE = llvm::StructType::create(context,
"frame_map_type");
66 llvm::Type::getInt64Ty(context);
67 FRAME_MAP_TYPE->setBody(int64type);
70 STACK_ENTRY_TYPE = llvm::StructType::create(context,
"stack_entry_type");
71 llvm::PointerType *int64ptr =
72 llvm::PointerType::get(llvm::Type::getInt64Ty(context),
74 llvm::ArrayType *root_array = llvm::ArrayType::get(int64ptr, 0);
79 STACK_ENTRY_TYPE->setBody({int64ptr, int64ptr, root_array});
82 virtual std::string llvmStrategy() {
return "shadow-stack"; }
84 void applyStrategy(llvm::Function *f);
86 void relieveStackEntry();
95 llvm::LLVMContext &context;
96 llvm::IRBuilder<> &builder;
98 inline static constexpr int REFCNT_SIZE =
sizeof(int32_t);
100 inline static std::string REFCNT_MALLOC_WRAPPER_NAME =
101 "refcnt_malloc_wrapper";
104 void declare_refcnt_visitor(
bool is_main_file,
105 llvm::StructType *stack_entry_type,
106 llvm::StructType *frame_map_type);
107 void declare_malloc_wrapper(
bool is_main_file);
108 void decrease_refcnt(llvm::Value *);
109 void increase_refcnt(llvm::Value *);
111 : module(*resPtr.Module.get()), context(*resPtr.Context.get()),
112 builder(*resPtr.Builder) {}
Defined LLVMRes, which encapsulates the state of LLVM (Context, Modules, IRBuilder,...