LLVM  3.7.0
ShadowStackGC.cpp
Go to the documentation of this file.
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"
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 
36 using namespace llvm;
37 
38 #define DEBUG_TYPE "shadowstackgc"
39 
40 namespace {
41 class ShadowStackGC : public GCStrategy {
42 public:
43  ShadowStackGC();
44 };
45 }
46 
48  X("shadow-stack", "Very portable GC for uncooperative code generators");
49 
51 
52 ShadowStackGC::ShadowStackGC() {
53  InitRoots = true;
54  CustomRoots = true;
55 }
void linkShadowStackGC()
Creates a shadow stack garbage collector.
Module.h This file contains the declarations for the Module class.
GCStrategy describes a garbage collector algorithm's code generation requirements, and provides overridable hooks for those needs which cannot be abstractly described.
Definition: GCStrategy.h:78
static GCRegistry::Add< ShadowStackGC > X("shadow-stack","Very portable GC for uncooperative code generators")
A static registration template.
Definition: Registry.h:201