mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-04 10:04:33 +00:00
02d6288667
script. This is in preparation for changes to lots of include lines. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@229088 91177308-0d34-0410-b5e6-96231b3b80d8
56 lines
1.7 KiB
C++
56 lines
1.7 KiB
C++
//===-- ShadowStackGC.cpp - GC support for uncooperative targets ----------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements lowering for the llvm.gc* intrinsics for targets that do
|
|
// not natively support them (which includes the C backend). Note that the code
|
|
// generated is not quite as efficient as algorithms which generate stack maps
|
|
// to identify roots.
|
|
//
|
|
// This pass implements the code transformation described in this paper:
|
|
// "Accurate Garbage Collection in an Uncooperative Environment"
|
|
// Fergus Henderson, ISMM, 2002
|
|
//
|
|
// In runtime/GC/SemiSpace.cpp is a prototype runtime which is compatible with
|
|
// ShadowStackGC.
|
|
//
|
|
// In order to support this particular transformation, all stack roots are
|
|
// coallocated in the stack. This allows a fully target-independent stack map
|
|
// while introducing only minor runtime overhead.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/CodeGen/GCs.h"
|
|
#include "llvm/ADT/StringExtras.h"
|
|
#include "llvm/CodeGen/GCStrategy.h"
|
|
#include "llvm/IR/CallSite.h"
|
|
#include "llvm/IR/IRBuilder.h"
|
|
#include "llvm/IR/IntrinsicInst.h"
|
|
#include "llvm/IR/Module.h"
|
|
|
|
using namespace llvm;
|
|
|
|
#define DEBUG_TYPE "shadowstackgc"
|
|
|
|
namespace {
|
|
class ShadowStackGC : public GCStrategy {
|
|
public:
|
|
ShadowStackGC();
|
|
};
|
|
}
|
|
|
|
static GCRegistry::Add<ShadowStackGC>
|
|
X("shadow-stack", "Very portable GC for uncooperative code generators");
|
|
|
|
void llvm::linkShadowStackGC() {}
|
|
|
|
ShadowStackGC::ShadowStackGC() {
|
|
InitRoots = true;
|
|
CustomRoots = true;
|
|
}
|