mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	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;
 | |
| }
 |