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 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 47 static GCRegistry::Add<ShadowStackGC> 48 X("shadow-stack", "Very portable GC for uncooperative code generators"); 49 linkShadowStackGC()50void llvm::linkShadowStackGC() {} 51 ShadowStackGC()52ShadowStackGC::ShadowStackGC() { 53 InitRoots = true; 54 CustomRoots = true; 55 } 56