Home | History | Annotate | Download | only in CodeGen
      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 
     50 void llvm::linkShadowStackGC() {}
     51 
     52 ShadowStackGC::ShadowStackGC() {
     53   InitRoots = true;
     54   CustomRoots = true;
     55 }
     56