| //===-- ShadowStackGC.cpp - GC support for uncooperative targets ----------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file implements lowering for the llvm.gc* intrinsics for targets that do |
| // not natively support them (which includes the C backend). Note that the code |
| // generated is not quite as efficient as algorithms which generate stack maps |
| // to identify roots. |
| // |
| // This pass implements the code transformation described in this paper: |
| // "Accurate Garbage Collection in an Uncooperative Environment" |
| // Fergus Henderson, ISMM, 2002 |
| // |
| // In runtime/GC/SemiSpace.cpp is a prototype runtime which is compatible with |
| // ShadowStackGC. |
| // |
| // In order to support this particular transformation, all stack roots are |
| // coallocated in the stack. This allows a fully target-independent stack map |
| // while introducing only minor runtime overhead. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "llvm/CodeGen/GCs.h" |
| #include "llvm/ADT/StringExtras.h" |
| #include "llvm/CodeGen/GCStrategy.h" |
| #include "llvm/IR/CallSite.h" |
| #include "llvm/IR/IRBuilder.h" |
| #include "llvm/IR/IntrinsicInst.h" |
| #include "llvm/IR/Module.h" |
| |
| using namespace llvm; |
| |
| #define DEBUG_TYPE "shadowstackgc" |
| |
| namespace { |
| class ShadowStackGC : public GCStrategy { |
| public: |
| ShadowStackGC(); |
| }; |
| } |
| |
| static GCRegistry::Add<ShadowStackGC> |
| X("shadow-stack", "Very portable GC for uncooperative code generators"); |
| |
| void llvm::linkShadowStackGC() {} |
| |
| ShadowStackGC::ShadowStackGC() { |
| InitRoots = true; |
| CustomRoots = true; |
| } |