mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	Add an option to allocate JITed global data separately from code. By
default, this option is not enabled to support clients who rely on this behavior. Fixes http://llvm.org/PR4483 A patch to allocate additional memory for globals after we run out is forthcoming. Patch by Reid Kleckner! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75059 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		| @@ -267,6 +267,11 @@ public: | ||||
|     return Result; | ||||
|   } | ||||
|  | ||||
|   /// allocateGlobal - Allocate memory for a global.  Unlike allocateSpace, | ||||
|   /// this method does not allocate memory in the current output buffer, | ||||
|   /// because a global may live longer than the current function. | ||||
|   virtual void *allocateGlobal(uintptr_t Size, unsigned Alignment) = 0; | ||||
|  | ||||
|   /// StartMachineBasicBlock - This should be called by the target when a new | ||||
|   /// basic block is about to be emitted.  This way the MCE knows where the | ||||
|   /// start of the block is, and can implement getMachineBasicBlockAddress. | ||||
|   | ||||
| @@ -87,7 +87,8 @@ protected: | ||||
|   // libraries, the JIT and Interpreter set these functions to ctor pointers | ||||
|   // at startup time if they are linked in. | ||||
|   typedef ExecutionEngine *(*EECtorFn)(ModuleProvider*, std::string*, | ||||
|                                        CodeGenOpt::Level OptLevel); | ||||
|                                        CodeGenOpt::Level OptLevel, | ||||
|                                        bool GVsWithCode); | ||||
|   static EECtorFn JITCtor, InterpCtor; | ||||
|  | ||||
|   /// LazyFunctionCreator - If an unknown function is needed, this function | ||||
| @@ -118,8 +119,18 @@ public: | ||||
|                                  bool ForceInterpreter = false, | ||||
|                                  std::string *ErrorStr = 0, | ||||
|                                  CodeGenOpt::Level OptLevel = | ||||
|                                    CodeGenOpt::Default); | ||||
|    | ||||
|                                    CodeGenOpt::Default, | ||||
|                                  // Allocating globals with code breaks | ||||
|                                  // freeMachineCodeForFunction and is probably | ||||
|                                  // unsafe and bad for performance.  However, | ||||
|                                  // we have clients who depend on this | ||||
|                                  // behavior, so we must support it. | ||||
|                                  // Eventually, when we're willing to break | ||||
|                                  // some backwards compatability, this flag | ||||
|                                  // should be flipped to false, so that by | ||||
|                                  // default freeMachineCodeForFunction works. | ||||
|                                  bool GVsWithCode = true); | ||||
|  | ||||
|   /// create - This is the factory method for creating an execution engine which | ||||
|   /// is appropriate for the current machine.  This takes ownership of the | ||||
|   /// module. | ||||
| @@ -132,7 +143,8 @@ public: | ||||
|                                     std::string *ErrorStr = 0, | ||||
|                                     JITMemoryManager *JMM = 0, | ||||
|                                     CodeGenOpt::Level OptLevel = | ||||
|                                       CodeGenOpt::Default); | ||||
|                                       CodeGenOpt::Default, | ||||
|                                     bool GVsWithCode = true); | ||||
|  | ||||
|   /// addModuleProvider - Add a ModuleProvider to the list of modules that we | ||||
|   /// can JIT from.  Note that this takes ownership of the ModuleProvider: when | ||||
|   | ||||
| @@ -28,6 +28,7 @@ protected: | ||||
|   bool HasGOT; | ||||
|   bool SizeRequired; | ||||
| public: | ||||
|  | ||||
|   JITMemoryManager() : HasGOT(false), SizeRequired(false) {} | ||||
|   virtual ~JITMemoryManager(); | ||||
|    | ||||
| @@ -43,6 +44,11 @@ public: | ||||
|   /// start execution, the code pages may need permissions changed. | ||||
|   virtual void setMemoryExecutable(void) = 0; | ||||
|  | ||||
|   /// setPoisonMemory - Setting this flag to true makes the memory manager | ||||
|   /// garbage values over freed memory.  This is useful for testing and | ||||
|   /// debugging, and is be turned on by default in debug mode. | ||||
|   virtual void setPoisonMemory(bool poison) = 0; | ||||
|  | ||||
|   //===--------------------------------------------------------------------===// | ||||
|   // Global Offset Table Management | ||||
|   //===--------------------------------------------------------------------===// | ||||
| @@ -114,7 +120,10 @@ public: | ||||
|  | ||||
|   /// allocateSpace - Allocate a memory block of the given size. | ||||
|   virtual uint8_t *allocateSpace(intptr_t Size, unsigned Alignment) = 0; | ||||
|    | ||||
|  | ||||
|   /// allocateGlobal - Allocate memory for a global. | ||||
|   virtual uint8_t *allocateGlobal(uintptr_t Size, unsigned Alignment) = 0; | ||||
|  | ||||
|   /// deallocateMemForFunction - Free JIT memory for the specified function. | ||||
|   /// This is never called when the JIT is currently emitting a function. | ||||
|   virtual void deallocateMemForFunction(const Function *F) = 0; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user