diff options
Diffstat (limited to 'contrib/llvm/lib/CodeGen/ShadowStackGC.cpp')
-rw-r--r-- | contrib/llvm/lib/CodeGen/ShadowStackGC.cpp | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/contrib/llvm/lib/CodeGen/ShadowStackGC.cpp b/contrib/llvm/lib/CodeGen/ShadowStackGC.cpp new file mode 100644 index 0000000..b12e943 --- /dev/null +++ b/contrib/llvm/lib/CodeGen/ShadowStackGC.cpp @@ -0,0 +1,55 @@ +//===-- 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; +} |