From b59dbad71067c3f7f4466e43e284fd1a1fa9e3a5 Mon Sep 17 00:00:00 2001 From: Mikhail Glushenkov Date: Sun, 7 Dec 2008 16:42:47 +0000 Subject: [PATCH] Try to guess when the auto-generated cl::Sink option should be marked 'extern'. This would be much easier to do if the CommandLine library didn't use global state. Global state is evil. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60659 91177308-0d34-0410-b5e6-96231b3b80d8 --- utils/TableGen/LLVMCConfigurationEmitter.cpp | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/utils/TableGen/LLVMCConfigurationEmitter.cpp b/utils/TableGen/LLVMCConfigurationEmitter.cpp index 3456b9abce4..ceb1ac64d23 100644 --- a/utils/TableGen/LLVMCConfigurationEmitter.cpp +++ b/utils/TableGen/LLVMCConfigurationEmitter.cpp @@ -1427,7 +1427,7 @@ void EmitToolClassDefinition (const ToolDescription& D, /// EmitOptionDefintions - Iterate over a list of option descriptions /// and emit registration code. void EmitOptionDefintions (const OptionDescriptions& descs, - bool HasSink, + bool HasSink, bool HasExterns, std::ostream& O) { std::vector Aliases; @@ -1503,7 +1503,9 @@ void EmitOptionDefintions (const OptionDescriptions& descs, // Emit the sink option. if (HasSink) - O << "cl::list " << SinkOptionName << "(cl::Sink);\n"; + O << (HasExterns ? "extern cl" : "cl") + << "::list " << SinkOptionName + << (HasExterns ? ";\n" : "(cl::Sink);\n"); O << '\n'; } @@ -1744,20 +1746,32 @@ void EmitIncludes(std::ostream& O) { struct PluginData { OptionDescriptions OptDescs; bool HasSink; + bool HasExterns; ToolDescriptions ToolDescs; RecordVector Edges; int Priority; }; /// HasSink - Go through the list of tool descriptions and check if -/// there is one with the 'sink' property set. +/// there are any with the 'sink' property set. bool HasSink(const ToolDescriptions& ToolDescs) { for (ToolDescriptions::const_iterator B = ToolDescs.begin(), E = ToolDescs.end(); B != E; ++B) if ((*B)->isSink()) return true; - return false; + return false; +} + +/// HasExterns - Go through the list of option descriptions and check +/// if there are any external options. +bool HasExterns(const OptionDescriptions& OptDescs) { + for (OptionDescriptions::const_iterator B = OptDescs.begin(), + E = OptDescs.end(); B != E; ++B) + if (B->second.isExtern()) + return true; + + return false; } /// CollectPluginData - Collect tool and option properties, @@ -1773,6 +1787,7 @@ void CollectPluginData (const RecordKeeper& Records, PluginData& Data) { const RecordVector& Tools = Records.getAllDerivedDefinitions("Tool"); CollectToolDescriptions(Tools.begin(), Tools.end(), Data.ToolDescs); Data.HasSink = HasSink(Data.ToolDescs); + Data.HasExterns = HasExterns(Data.OptDescs); // Collect compilation graph edges. const RecordVector& CompilationGraphs = @@ -1805,7 +1820,7 @@ void EmitPluginCode(const PluginData& Data, std::ostream& O) { EmitIncludes(O); // Emit global option registration code. - EmitOptionDefintions(Data.OptDescs, Data.HasSink, O); + EmitOptionDefintions(Data.OptDescs, Data.HasSink, Data.HasExterns, O); // Emit hook declarations. EmitHookDeclarations(Data.ToolDescs, O); -- 2.11.0