1//===-- ShadowStackGC.cpp - GC support for uncooperative targets ----------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements lowering for the llvm.gc* intrinsics for targets that do
11// not natively support them (which includes the C backend). Note that the code
12// generated is not quite as efficient as algorithms which generate stack maps
13// to identify roots.
14//
15// This pass implements the code transformation described in this paper:
16//   "Accurate Garbage Collection in an Uncooperative Environment"
17//   Fergus Henderson, ISMM, 2002
18//
19// In runtime/GC/SemiSpace.cpp is a prototype runtime which is compatible with
20// ShadowStackGC.
21//
22// In order to support this particular transformation, all stack roots are
23// coallocated in the stack. This allows a fully target-independent stack map
24// while introducing only minor runtime overhead.
25//
26//===----------------------------------------------------------------------===//
27
28#include "llvm/CodeGen/GCs.h"
29#include "llvm/ADT/StringExtras.h"
30#include "llvm/CodeGen/GCStrategy.h"
31#include "llvm/IR/CallSite.h"
32#include "llvm/IR/IRBuilder.h"
33#include "llvm/IR/IntrinsicInst.h"
34#include "llvm/IR/Module.h"
35
36using namespace llvm;
37
38#define DEBUG_TYPE "shadowstackgc"
39
40namespace {
41class ShadowStackGC : public GCStrategy {
42public:
43  ShadowStackGC();
44};
45}
46
47static GCRegistry::Add<ShadowStackGC>
48    X("shadow-stack", "Very portable GC for uncooperative code generators");
49
50void llvm::linkShadowStackGC() {}
51
52ShadowStackGC::ShadowStackGC() {
53  InitRoots = true;
54  CustomRoots = true;
55}
56