summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorMikhail Glushenkov <foldr@codedgers.com>2008-12-07 16:42:47 +0000
committerMikhail Glushenkov <foldr@codedgers.com>2008-12-07 16:42:47 +0000
commitb59dbad71067c3f7f4466e43e284fd1a1fa9e3a5 (patch)
tree4a5737a0f3a92caeb3511d5a9b65d25eb1a44de0 /utils
parent08509493e53baf43ff23cc5436d2450cf5bf3c5e (diff)
downloadllvm-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.cpp25
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);