diff --git a/include/dxc/DxilValidation/DxilValidation.h b/include/dxc/DxilValidation/DxilValidation.h index b4f49a3515..c7e413e9ef 100644 --- a/include/dxc/DxilValidation/DxilValidation.h +++ b/include/dxc/DxilValidation/DxilValidation.h @@ -81,7 +81,7 @@ class PrintDiagnosticContext { bool HasWarnings() const; void Handle(const llvm::DiagnosticInfo &DI); - static void PrintDiagnosticHandler(const llvm::DiagnosticInfo &DI, + static void PrintDiagnosticHandler(const llvm::DiagnosticInfo *DI, void *Context); }; diff --git a/include/llvm/CodeGen/MachinePassRegistry.h b/include/llvm/CodeGen/MachinePassRegistry.h index cf04c640c3..31f4271b14 100644 --- a/include/llvm/CodeGen/MachinePassRegistry.h +++ b/include/llvm/CodeGen/MachinePassRegistry.h @@ -23,71 +23,59 @@ namespace llvm { -typedef void *(*MachinePassCtor)(); - - //===----------------------------------------------------------------------===// /// /// MachinePassRegistryListener - Listener to adds and removals of nodes in /// registration list. /// //===----------------------------------------------------------------------===// -class MachinePassRegistryListener { - virtual void anchor(); +template class MachinePassRegistryListener { + virtual void anchor() {} + public: MachinePassRegistryListener() {} virtual ~MachinePassRegistryListener() {} - virtual void NotifyAdd(const char *N, MachinePassCtor C, const char *D) = 0; + virtual void NotifyAdd(const char *N, PassCtorTy C, const char *D) = 0; virtual void NotifyRemove(const char *N) = 0; }; - //===----------------------------------------------------------------------===// /// /// MachinePassRegistryNode - Machine pass node stored in registration list. /// //===----------------------------------------------------------------------===// -class MachinePassRegistryNode { - +template class MachinePassRegistryNode { private: MachinePassRegistryNode *Next; // Next function pass in list. const char *Name; // Name of function pass. const char *Description; // Description string. - MachinePassCtor Ctor; // Function pass creator. + PassCtorTy Ctor; // Pass creator. public: - - MachinePassRegistryNode(const char *N, const char *D, MachinePassCtor C) - : Next(nullptr) - , Name(N) - , Description(D) - , Ctor(C) - {} + MachinePassRegistryNode(const char *N, const char *D, PassCtorTy C) + : Next(nullptr), Name(N), Description(D), Ctor(C) {} // Accessors MachinePassRegistryNode *getNext() const { return Next; } MachinePassRegistryNode **getNextAddress() { return &Next; } const char *getName() const { return Name; } const char *getDescription() const { return Description; } - MachinePassCtor getCtor() const { return Ctor; } - void setNext(MachinePassRegistryNode *N) { Next = N; } - + PassCtorTy getCtor() const { return Ctor; } + void setNext(MachinePassRegistryNode *N) { Next = N; } }; - //===----------------------------------------------------------------------===// /// /// MachinePassRegistry - Track the registration of machine passes. /// //===----------------------------------------------------------------------===// -class MachinePassRegistry { - +template class MachinePassRegistry { private: - - MachinePassRegistryNode *List; // List of registry nodes. - MachinePassCtor Default; // Default function pass creator. - MachinePassRegistryListener* Listener;// Listener for list adds are removes. + MachinePassRegistryNode *List; // List of registry nodes. + PassCtorTy Default; // Default function pass creator. + MachinePassRegistryListener + *Listener; // Listener for list adds are removes. public: @@ -96,32 +84,59 @@ class MachinePassRegistry { // Accessors. // - MachinePassRegistryNode *getList() { return List; } - MachinePassCtor getDefault() { return Default; } - void setDefault(MachinePassCtor C) { Default = C; } - void setDefault(StringRef Name); - void setListener(MachinePassRegistryListener *L) { Listener = L; } + MachinePassRegistryNode *getList() { return List; } + PassCtorTy getDefault() { return Default; } + void setDefault(PassCtorTy C) { Default = C; } + /// setDefault - Set the default constructor by name. + void setDefault(StringRef Name) { + PassCtorTy Ctor = nullptr; + for (MachinePassRegistryNode *R = getList(); R; + R = R->getNext()) { + if (R->getName() == Name) { + Ctor = R->getCtor(); + break; + } + } + assert(Ctor && "Unregistered pass name"); + setDefault(Ctor); + } + void setListener(MachinePassRegistryListener *L) { Listener = L; } /// Add - Adds a function pass to the registration list. /// - void Add(MachinePassRegistryNode *Node); + void Add(MachinePassRegistryNode *Node) { + Node->setNext(List); + List = Node; + if (Listener) + Listener->NotifyAdd(Node->getName(), Node->getCtor(), + Node->getDescription()); + } /// Remove - Removes a function pass from the registration list. /// - void Remove(MachinePassRegistryNode *Node); - + void Remove(MachinePassRegistryNode *Node) { + for (MachinePassRegistryNode **I = &List; *I; + I = (*I)->getNextAddress()) { + if (*I == Node) { + if (Listener) + Listener->NotifyRemove(Node->getName()); + *I = (*I)->getNext(); + break; + } + } + } }; - //===----------------------------------------------------------------------===// /// /// RegisterPassParser class - Handle the addition of new machine passes. /// -// // -/////////////////////////////////////////////////////////////////////////////// -template -class RegisterPassParser : public MachinePassRegistryListener, - public cl::parser { +//===----------------------------------------------------------------------===// +template +class RegisterPassParser + : public MachinePassRegistryListener< + typename RegistryClass::FunctionPassCtor>, + public cl::parser { public: RegisterPassParser(cl::Option &O) : cl::parser(O) {} @@ -144,15 +159,15 @@ class RegisterPassParser : public MachinePassRegistryListener, // Implement the MachinePassRegistryListener callbacks. // - void NotifyAdd(const char *N, MachinePassCtor C, const char *D) override { - this->addLiteralOption(N, (typename RegistryClass::FunctionPassCtor)C, D); + void NotifyAdd(const char *N, typename RegistryClass::FunctionPassCtor C, + const char *D) override { + this->addLiteralOption(N, C, D); } void NotifyRemove(const char *N) override { this->removeLiteralOption(N); } }; - } // end namespace llvm #endif diff --git a/include/llvm/CodeGen/MachineScheduler.h b/include/llvm/CodeGen/MachineScheduler.h index 278d84ba5a..9506023560 100644 --- a/include/llvm/CodeGen/MachineScheduler.h +++ b/include/llvm/CodeGen/MachineScheduler.h @@ -114,17 +114,19 @@ struct MachineSchedContext { /// MachineSchedRegistry provides a selection of available machine instruction /// schedulers. -class MachineSchedRegistry : public MachinePassRegistryNode { +class MachineSchedRegistry + : public MachinePassRegistryNode< + ScheduleDAGInstrs *(*)(MachineSchedContext *)> { public: typedef ScheduleDAGInstrs *(*ScheduleDAGCtor)(MachineSchedContext *); // RegisterPassParser requires a (misnamed) FunctionPassCtor type. typedef ScheduleDAGCtor FunctionPassCtor; - static MachinePassRegistry Registry; + static MachinePassRegistry Registry; MachineSchedRegistry(const char *N, const char *D, ScheduleDAGCtor C) - : MachinePassRegistryNode(N, D, (MachinePassCtor)C) { + : MachinePassRegistryNode(N, D, C) { Registry.Add(this); } ~MachineSchedRegistry() { Registry.Remove(this); } @@ -137,7 +139,8 @@ class MachineSchedRegistry : public MachinePassRegistryNode { static MachineSchedRegistry *getList() { return (MachineSchedRegistry *)Registry.getList(); } - static void setListener(MachinePassRegistryListener *L) { + + static void setListener(MachinePassRegistryListener *L) { Registry.setListener(L); } }; diff --git a/include/llvm/CodeGen/RegAllocRegistry.h b/include/llvm/CodeGen/RegAllocRegistry.h index 9a639ad817..4b5b5c1e06 100644 --- a/include/llvm/CodeGen/RegAllocRegistry.h +++ b/include/llvm/CodeGen/RegAllocRegistry.h @@ -23,23 +23,19 @@ namespace llvm { /// /// RegisterRegAlloc class - Track the registration of register allocators. /// -// // -/////////////////////////////////////////////////////////////////////////////// -class RegisterRegAlloc : public MachinePassRegistryNode { - +//===----------------------------------------------------------------------===// +class RegisterRegAlloc : public MachinePassRegistryNode { public: typedef FunctionPass *(*FunctionPassCtor)(); - static MachinePassRegistry Registry; + static MachinePassRegistry Registry; RegisterRegAlloc(const char *N, const char *D, FunctionPassCtor C) - : MachinePassRegistryNode(N, D, (MachinePassCtor)C) - { - Registry.Add(this); + : MachinePassRegistryNode(N, D, C) { + Registry.Add(this); } ~RegisterRegAlloc() { Registry.Remove(this); } - // Accessors. // @@ -49,16 +45,14 @@ class RegisterRegAlloc : public MachinePassRegistryNode { static RegisterRegAlloc *getList() { return (RegisterRegAlloc *)Registry.getList(); } - static FunctionPassCtor getDefault() { - return (FunctionPassCtor)Registry.getDefault(); - } - static void setDefault(FunctionPassCtor C) { - Registry.setDefault((MachinePassCtor)C); - } - static void setListener(MachinePassRegistryListener *L) { + + static FunctionPassCtor getDefault() { return Registry.getDefault(); } + + static void setDefault(FunctionPassCtor C) { Registry.setDefault(C); } + + static void setListener(MachinePassRegistryListener *L) { Registry.setListener(L); } - }; } // end namespace llvm diff --git a/include/llvm/CodeGen/SchedulerRegistry.h b/include/llvm/CodeGen/SchedulerRegistry.h index e4570a8adc..02fd338e91 100644 --- a/include/llvm/CodeGen/SchedulerRegistry.h +++ b/include/llvm/CodeGen/SchedulerRegistry.h @@ -32,16 +32,19 @@ class ScheduleDAGSDNodes; class SelectionDAG; class MachineBasicBlock; -class RegisterScheduler : public MachinePassRegistryNode { +class RegisterScheduler + : public MachinePassRegistryNode< + ScheduleDAGSDNodes *(*)(SelectionDAGISel *, CodeGenOpt::Level)> { public: typedef ScheduleDAGSDNodes *(*FunctionPassCtor)(SelectionDAGISel*, CodeGenOpt::Level); - static MachinePassRegistry Registry; + static MachinePassRegistry Registry; RegisterScheduler(const char *N, const char *D, FunctionPassCtor C) - : MachinePassRegistryNode(N, D, (MachinePassCtor)C) - { Registry.Add(this); } + : MachinePassRegistryNode(N, D, C) { + Registry.Add(this); + } ~RegisterScheduler() { Registry.Remove(this); } @@ -53,13 +56,8 @@ class RegisterScheduler : public MachinePassRegistryNode { static RegisterScheduler *getList() { return (RegisterScheduler *)Registry.getList(); } - static FunctionPassCtor getDefault() { - return (FunctionPassCtor)Registry.getDefault(); - } - static void setDefault(FunctionPassCtor C) { - Registry.setDefault((MachinePassCtor)C); - } - static void setListener(MachinePassRegistryListener *L) { + + static void setListener(MachinePassRegistryListener *L) { Registry.setListener(L); } }; diff --git a/include/llvm/IR/LLVMContext.h b/include/llvm/IR/LLVMContext.h index 0c05329774..d964b4a14e 100644 --- a/include/llvm/IR/LLVMContext.h +++ b/include/llvm/IR/LLVMContext.h @@ -83,7 +83,7 @@ class LLVMContext { /// Defines the type of a diagnostic handler. /// \see LLVMContext::setDiagnosticHandler. /// \see LLVMContext::diagnose. - typedef void (*DiagnosticHandlerTy)(const DiagnosticInfo &DI, void *Context); + typedef void (*DiagnosticHandlerTy)(const DiagnosticInfo *DI, void *Context); /// Defines the type of a yield callback. /// \see LLVMContext::setYieldCallback. diff --git a/lib/CodeGen/MachinePassRegistry.cpp b/lib/CodeGen/MachinePassRegistry.cpp index 3ee3e40b27..82daf80a87 100644 --- a/lib/CodeGen/MachinePassRegistry.cpp +++ b/lib/CodeGen/MachinePassRegistry.cpp @@ -15,41 +15,3 @@ #include "llvm/CodeGen/MachinePassRegistry.h" using namespace llvm; - -void MachinePassRegistryListener::anchor() { } - -/// setDefault - Set the default constructor by name. -void MachinePassRegistry::setDefault(StringRef Name) { - MachinePassCtor Ctor = nullptr; - for(MachinePassRegistryNode *R = getList(); R; R = R->getNext()) { - if (R->getName() == Name) { - Ctor = R->getCtor(); - break; - } - } - assert(Ctor && "Unregistered pass name"); - setDefault(Ctor); -} - -/// Add - Adds a function pass to the registration list. -/// -void MachinePassRegistry::Add(MachinePassRegistryNode *Node) { - Node->setNext(List); - List = Node; - if (Listener) Listener->NotifyAdd(Node->getName(), - Node->getCtor(), - Node->getDescription()); -} - - -/// Remove - Removes a function pass from the registration list. -/// -void MachinePassRegistry::Remove(MachinePassRegistryNode *Node) { - for (MachinePassRegistryNode **I = &List; *I; I = (*I)->getNextAddress()) { - if (*I == Node) { - if (Listener) Listener->NotifyRemove(Node->getName()); - *I = (*I)->getNext(); - break; - } - } -} diff --git a/lib/CodeGen/MachineScheduler.cpp b/lib/CodeGen/MachineScheduler.cpp index a48e54caf3..b40e381e5c 100644 --- a/lib/CodeGen/MachineScheduler.cpp +++ b/lib/CodeGen/MachineScheduler.cpp @@ -190,7 +190,8 @@ void PostMachineScheduler::getAnalysisUsage(AnalysisUsage &AU) const { MachineFunctionPass::getAnalysisUsage(AU); } -MachinePassRegistry MachineSchedRegistry::Registry; +MachinePassRegistry + MachineSchedRegistry::Registry; /// A dummy default scheduler factory indicates whether the scheduler /// is overridden on the command line. diff --git a/lib/CodeGen/Passes.cpp b/lib/CodeGen/Passes.cpp index 024d166a49..3159fbd5a0 100644 --- a/lib/CodeGen/Passes.cpp +++ b/lib/CodeGen/Passes.cpp @@ -648,7 +648,8 @@ bool TargetPassConfig::getOptimizeRegAlloc() const { } /// RegisterRegAlloc's global Registry tracks allocator registration. -MachinePassRegistry RegisterRegAlloc::Registry; +MachinePassRegistry + RegisterRegAlloc::Registry; /// A dummy default pass factory indicates whether the register allocator is /// overridden on the command line. diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index 97ece8b924..6ac04cadd9 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -228,7 +228,8 @@ static const bool ViewDAGCombine1 = false, /// RegisterScheduler class - Track the registration of instruction schedulers. /// //===---------------------------------------------------------------------===// -MachinePassRegistry RegisterScheduler::Registry; +MachinePassRegistry + RegisterScheduler::Registry; //===---------------------------------------------------------------------===// /// diff --git a/lib/DxilValidation/DxilValidation.cpp b/lib/DxilValidation/DxilValidation.cpp index 9587897e22..16f377edcd 100644 --- a/lib/DxilValidation/DxilValidation.cpp +++ b/lib/DxilValidation/DxilValidation.cpp @@ -85,9 +85,9 @@ void PrintDiagnosticContext::Handle(const DiagnosticInfo &DI) { m_Printer << "\n"; } -void PrintDiagnosticContext::PrintDiagnosticHandler(const DiagnosticInfo &DI, +void PrintDiagnosticContext::PrintDiagnosticHandler(const DiagnosticInfo *DI, void *Context) { - reinterpret_cast(Context)->Handle(DI); + reinterpret_cast(Context)->Handle(*DI); } struct PSExecutionInfo { diff --git a/lib/IR/LLVMContext.cpp b/lib/IR/LLVMContext.cpp index 0e4a11e11a..177129218f 100644 --- a/lib/IR/LLVMContext.cpp +++ b/lib/IR/LLVMContext.cpp @@ -227,7 +227,7 @@ void LLVMContext::diagnose(const DiagnosticInfo &DI) { // If there is a report handler, use it. if (pImpl->DiagnosticHandler) { if (!pImpl->RespectDiagnosticFilters || isDiagnosticEnabled(DI)) - pImpl->DiagnosticHandler(DI, pImpl->DiagnosticContext); + pImpl->DiagnosticHandler(&DI, pImpl->DiagnosticContext); return; } diff --git a/tools/clang/lib/CodeGen/CodeGenAction.cpp b/tools/clang/lib/CodeGen/CodeGenAction.cpp index d8339f25b3..7c11771f33 100644 --- a/tools/clang/lib/CodeGen/CodeGenAction.cpp +++ b/tools/clang/lib/CodeGen/CodeGenAction.cpp @@ -238,9 +238,9 @@ namespace clang { void linkerDiagnosticHandler(const llvm::DiagnosticInfo &DI); - static void DiagnosticHandler(const llvm::DiagnosticInfo &DI, + static void DiagnosticHandler(const llvm::DiagnosticInfo *DI, void *Context) { - ((BackendConsumer *)Context)->DiagnosticHandlerImpl(DI); + ((BackendConsumer *)Context)->DiagnosticHandlerImpl(*DI); } void InlineAsmDiagHandler2(const llvm::SMDiagnostic &, diff --git a/tools/llvm-dis/llvm-dis.cpp b/tools/llvm-dis/llvm-dis.cpp index 6e54671002..36e432a3b3 100644 --- a/tools/llvm-dis/llvm-dis.cpp +++ b/tools/llvm-dis/llvm-dis.cpp @@ -115,10 +115,10 @@ class CommentWriter : public AssemblyAnnotationWriter { } // end anon namespace -static void diagnosticHandler(const DiagnosticInfo &DI, void *Context) { +static void diagnosticHandler(const DiagnosticInfo *DI, void *Context) { raw_ostream &OS = errs(); OS << (char *)Context << ": "; - switch (DI.getSeverity()) { + switch (DI->getSeverity()) { case DS_Error: OS << "error: "; break; case DS_Warning: OS << "warning: "; break; case DS_Remark: OS << "remark: "; break; @@ -126,10 +126,10 @@ static void diagnosticHandler(const DiagnosticInfo &DI, void *Context) { } DiagnosticPrinterRawOStream DP(OS); - DI.print(DP); + DI->print(DP); OS << '\n'; - if (DI.getSeverity() == DS_Error) + if (DI->getSeverity() == DS_Error) exit(1); }