From 2536f801dc8161bf7cbd123abe9e191d0ce40cd1 Mon Sep 17 00:00:00 2001 From: Francois Pichet Date: Thu, 19 May 2011 02:54:11 +0000 Subject: [PATCH] Fix the MSVC build. Use a set of overloaded functions instead of template function for CreatePassFn. It seems that template deduction for functions type that differs only by return type doesn't work with MSVC. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@131624 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/StandardPasses.h | 33 +++++++++++++++------------ 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/include/llvm/Support/StandardPasses.h b/include/llvm/Support/StandardPasses.h index b027be7d850..8e323009c82 100644 --- a/include/llvm/Support/StandardPasses.h +++ b/include/llvm/Support/StandardPasses.h @@ -43,16 +43,21 @@ namespace llvm { StandardPass::CreateVerifierPass = CreateVerifierPass; } private: - /// Define a template function that does the casting for us, so that we can - /// perform safe function pointer casts, but catch unsafe ones. - template static llvm::Pass* - CreatePassFn(void) { return X(); } - template static llvm::Pass* - CreatePassFn(void) { return X(); } - template static llvm::Pass* - CreatePassFn(void) { return X(); } - template static llvm::Pass* - CreatePassFn(void) { return X(); } + /// Define a set of function overloads that does the casting for us, so + /// that we can perform safe function pointer casts, but catch unsafe ones. + PassInfo::NormalCtor_t static CreatePassFn(llvm::ImmutablePass*(*X)(void)) { + return reinterpret_cast(X); + } + PassInfo::NormalCtor_t static CreatePassFn(llvm::ModulePass*(*X)(void)) { + return reinterpret_cast(X); + } + PassInfo::NormalCtor_t static CreatePassFn(llvm::FunctionPass*(*X)(void)) { + return reinterpret_cast(X); + } + PassInfo::NormalCtor_t static CreatePassFn(llvm::Pass*(*X)(void)) { + return reinterpret_cast(X); + } + static llvm::Pass *CreateVerifierPass() { return createVerifierPass(); } /// Passes must be registered with functions that take no arguments, so we have /// to wrap their existing constructors. @@ -82,7 +87,7 @@ namespace llvm { // support "obvious" type-punning idioms. #define DEFAULT_ALIAS_ANALYSIS_PASS(pass, flags)\ StandardPass::RegisterDefaultPass(\ - CreatePassFn,\ + CreatePassFn(create ## pass ## Pass),\ &DefaultStandardPasses::pass ## ID, (unsigned char*)0, StandardPass::AliasAnalysis, flags) DEFAULT_ALIAS_ANALYSIS_PASS(TypeBasedAliasAnalysis, 0); DEFAULT_ALIAS_ANALYSIS_PASS(BasicAliasAnalysis, 0); @@ -90,7 +95,7 @@ namespace llvm { #define DEFAULT_FUNCTION_PASS(pass, flags)\ StandardPass::RegisterDefaultPass(\ - CreatePassFn,\ + CreatePassFn(create ## pass ## Pass),\ &DefaultStandardPasses::pass ## ID, 0, StandardPass::Function, flags) DEFAULT_FUNCTION_PASS(CFGSimplification, StandardPass::OptimzationFlags(1)); @@ -101,7 +106,7 @@ namespace llvm { #define DEFAULT_MODULE_PASS(pass, flags)\ StandardPass::RegisterDefaultPass(\ - CreatePassFn,\ + CreatePassFn(create ## pass ## Pass),\ &DefaultStandardPasses::pass ## ID, 0, StandardPass::Module, flags) // Optimize out global vars DEFAULT_MODULE_PASS(GlobalOptimizer, @@ -228,7 +233,7 @@ namespace llvm { #define DEFAULT_LTO_PASS(pass, flags)\ StandardPass::RegisterDefaultPass(\ - CreatePassFn,\ + CreatePassFn(create ## pass ## Pass),\ &DefaultStandardPasses::pass ## ID, 0, StandardPass::LTO, flags) // LTO passes