mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@109216 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			84 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //===--- Plugin.cpp - The LLVM Compiler Driver ------------------*- C++ -*-===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open
 | |
| // Source License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| //  Plugin support.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #include "llvm/CompilerDriver/Plugin.h"
 | |
| #include "llvm/Support/ManagedStatic.h"
 | |
| #include "llvm/System/Mutex.h"
 | |
| #include <algorithm>
 | |
| #include <vector>
 | |
| 
 | |
| namespace {
 | |
| 
 | |
|   // Registry::Add<> does not do lifetime management (probably issues
 | |
|   // with static constructor/destructor ordering), so we have to
 | |
|   // implement it here.
 | |
|   //
 | |
|   // All this static registration/life-before-main model seems
 | |
|   // unnecessary convoluted to me.
 | |
| 
 | |
|   static bool pluginListInitialized = false;
 | |
|   typedef std::vector<const llvmc::BasePlugin*> PluginList;
 | |
|   static PluginList Plugins;
 | |
|   static llvm::ManagedStatic<llvm::sys::SmartMutex<true> > PluginMutex;
 | |
| 
 | |
|   struct ByPriority {
 | |
|     bool operator()(const llvmc::BasePlugin* lhs,
 | |
|                     const llvmc::BasePlugin* rhs) {
 | |
|       return lhs->Priority() < rhs->Priority();
 | |
|     }
 | |
|   };
 | |
| }
 | |
| 
 | |
| namespace llvmc {
 | |
| 
 | |
|   PluginLoader::PluginLoader() {
 | |
|     llvm::sys::SmartScopedLock<true> Lock(*PluginMutex);
 | |
|     if (!pluginListInitialized) {
 | |
|       for (PluginRegistry::iterator B = PluginRegistry::begin(),
 | |
|              E = PluginRegistry::end(); B != E; ++B)
 | |
|         Plugins.push_back(B->instantiate());
 | |
|       std::sort(Plugins.begin(), Plugins.end(), ByPriority());
 | |
|     }
 | |
|     pluginListInitialized = true;
 | |
|   }
 | |
| 
 | |
|   PluginLoader::~PluginLoader() {
 | |
|     llvm::sys::SmartScopedLock<true> Lock(*PluginMutex);
 | |
|     if (pluginListInitialized) {
 | |
|       for (PluginList::iterator B = Plugins.begin(), E = Plugins.end();
 | |
|            B != E; ++B)
 | |
|         delete (*B);
 | |
|     }
 | |
|     pluginListInitialized = false;
 | |
|   }
 | |
| 
 | |
|   int PluginLoader::RunInitialization(LanguageMap& langMap,
 | |
|                                       CompilationGraph& graph) const
 | |
|   {
 | |
|     llvm::sys::SmartScopedLock<true> Lock(*PluginMutex);
 | |
|     for (PluginList::iterator B = Plugins.begin(), E = Plugins.end();
 | |
|          B != E; ++B) {
 | |
|       const BasePlugin* BP = *B;
 | |
|       if (int ret = BP->PreprocessOptions())
 | |
|         return ret;
 | |
|       if (int ret = BP->PopulateLanguageMap(langMap))
 | |
|         return ret;
 | |
|       if (int ret = BP->PopulateCompilationGraph(graph))
 | |
|         return ret;
 | |
|     }
 | |
| 
 | |
|     return 0;
 | |
|   }
 | |
| 
 | |
| }
 |