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