aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Support
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-11-19 17:08:15 +0000
committerChris Lattner <sabre@nondot.org>2004-11-19 17:08:15 +0000
commitc540ebbc1b7c2f6a92a968b4d36137a7332cea32 (patch)
tree6e5174e04c18d0c7d33c163da4517167b531ab49 /lib/Support
parent6405c9ec9f76fd9b8a3b35d2408a74485dc5d00a (diff)
downloadexternal_llvm-c540ebbc1b7c2f6a92a968b4d36137a7332cea32.zip
external_llvm-c540ebbc1b7c2f6a92a968b4d36137a7332cea32.tar.gz
external_llvm-c540ebbc1b7c2f6a92a968b4d36137a7332cea32.tar.bz2
Patches to avoid "leaking" memory on process exit. Patch contributed by
Morten Ofstad! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@17998 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support')
-rw-r--r--lib/Support/CommandLine.cpp64
1 files changed, 25 insertions, 39 deletions
diff --git a/lib/Support/CommandLine.cpp b/lib/Support/CommandLine.cpp
index df32165..5abeb8d 100644
--- a/lib/Support/CommandLine.cpp
+++ b/lib/Support/CommandLine.cpp
@@ -33,6 +33,17 @@ using namespace cl;
static const char *ProgramName = "<unknown>";
static const char *ProgramOverview = 0;
+// This collects additional help to be printed.
+static std::vector<const char*> &MoreHelp() {
+ static std::vector<const char*> moreHelp;
+ return moreHelp;
+}
+
+extrahelp::extrahelp(const char* Help)
+ : morehelp(Help) {
+ MoreHelp().push_back(Help);
+}
+
//===----------------------------------------------------------------------===//
// Basic, shared command line option processing machinery...
//
@@ -40,23 +51,19 @@ static const char *ProgramOverview = 0;
// Return the global command line option vector. Making it a function scoped
// static ensures that it will be initialized correctly before its first use.
//
-static std::map<std::string, Option*> *CommandLineOptions = 0;
static std::map<std::string, Option*> &getOpts() {
- if (CommandLineOptions == 0)
- CommandLineOptions = new std::map<std::string,Option*>();
- return *CommandLineOptions;
+ static std::map<std::string, Option*> CommandLineOptions;
+ return CommandLineOptions;
}
static Option *getOption(const std::string &Str) {
- if (CommandLineOptions == 0) return 0;
- std::map<std::string,Option*>::iterator I = CommandLineOptions->find(Str);
- return I != CommandLineOptions->end() ? I->second : 0;
+ std::map<std::string,Option*>::iterator I = getOpts().find(Str);
+ return I != getOpts().end() ? I->second : 0;
}
static std::vector<Option*> &getPositionalOpts() {
- static std::vector<Option*> *Positional = 0;
- if (!Positional) Positional = new std::vector<Option*>();
- return *Positional;
+ static std::vector<Option*> Positional;
+ return Positional;
}
static void AddArgument(const char *ArgName, Option *Opt) {
@@ -73,18 +80,13 @@ static void AddArgument(const char *ArgName, Option *Opt) {
// options have already been processed and the map has been deleted!
//
static void RemoveArgument(const char *ArgName, Option *Opt) {
- if (CommandLineOptions == 0) return;
#ifndef NDEBUG
// This disgusting HACK is brought to you courtesy of GCC 3.3.2, which ICE's
// If we pass ArgName directly into getOption here.
std::string Tmp = ArgName;
assert(getOption(Tmp) == Opt && "Arg not in map!");
#endif
- CommandLineOptions->erase(ArgName);
- if (CommandLineOptions->empty()) {
- delete CommandLineOptions;
- CommandLineOptions = 0;
- }
+ getOpts().erase(ArgName);
}
static inline bool ProvideOption(Option *Handler, const char *ArgName,
@@ -565,9 +567,9 @@ void cl::ParseCommandLineOptions(int &argc, char **argv,
// Free all of the memory allocated to the map. Command line options may only
// be processed once!
- delete CommandLineOptions;
- CommandLineOptions = 0;
+ getOpts().clear();
PositionalOpts.clear();
+ MoreHelp().clear();
// If we had an error processing our arguments, don't let the program execute
if (ErrorParsing) exit(1);
@@ -835,19 +837,6 @@ void generic_parser_base::printOptionInfo(const Option &O,
// --help and --help-hidden option implementation
//
-// If this variable is set, it is a pointer to a function that the user wants
-// us to call after we print out the help info. Basically a hook to allow
-// additional help to be printed.
-static std::vector<const char*>* MoreHelp = 0;
-
-extrahelp::extrahelp(const char* Help)
- : morehelp(Help) {
- if (!MoreHelp) {
- MoreHelp = new std::vector<const char*>;
- }
- MoreHelp->push_back(Help);
-}
-
namespace {
class HelpPrinter {
@@ -921,14 +910,11 @@ public:
for (unsigned i = 0, e = Options.size(); i != e; ++i)
Options[i].second->printOptionInfo(MaxArgLen);
- // Print any extra help the user has declared. If MoreHelp is not null,
- // then the user used at least one cl::extrahelp instance to provide
- // additional help. We just print it out now.
- if (MoreHelp != 0) {
- for (std::vector<const char *>::iterator I = MoreHelp->begin(),
- E = MoreHelp->end(); I != E; ++I)
- std::cerr << *I;
- }
+ // Print any extra help the user has declared.
+ for (std::vector<const char *>::iterator I = MoreHelp().begin(),
+ E = MoreHelp().end(); I != E; ++I)
+ std::cerr << *I;
+ MoreHelp().clear();
// Halt the program since help information was printed
exit(1);