12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- //===-- 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;
- }
|