diff options
author | Mikhail Glushenkov <foldr@codedgers.com> | 2008-12-07 16:42:47 +0000 |
---|---|---|
committer | Mikhail Glushenkov <foldr@codedgers.com> | 2008-12-07 16:42:47 +0000 |
commit | b59dbad71067c3f7f4466e43e284fd1a1fa9e3a5 (patch) | |
tree | 4a5737a0f3a92caeb3511d5a9b65d25eb1a44de0 /utils | |
parent | 08509493e53baf43ff23cc5436d2450cf5bf3c5e (diff) | |
download | llvm-b59dbad71067c3f7f4466e43e284fd1a1fa9e3a5.tar.gz llvm-b59dbad71067c3f7f4466e43e284fd1a1fa9e3a5.tar.bz2 llvm-b59dbad71067c3f7f4466e43e284fd1a1fa9e3a5.tar.xz |
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
Diffstat (limited to 'utils')
-rw-r--r-- | utils/TableGen/LLVMCConfigurationEmitter.cpp | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/utils/TableGen/LLVMCConfigurationEmitter.cpp b/utils/TableGen/LLVMCConfigurationEmitter.cpp index 3456b9abce..ceb1ac64d2 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<OptionDescription> Aliases; @@ -1503,7 +1503,9 @@ void EmitOptionDefintions (const OptionDescriptions& descs, // Emit the sink option. if (HasSink) - O << "cl::list<std::string> " << SinkOptionName << "(cl::Sink);\n"; + O << (HasExterns ? "extern cl" : "cl") + << "::list<std::string> " << 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); |