Add "target.expr-parser-compiler-args" setting.
This setting contains the following:
A list containing all the arguments to be passed to the expression parser compiler.
This change also ensures quoted arguments are handled appropriately.
See http://reviews.llvm.org/D5472 for more details.
Change by Tong Shen.
llvm-svn: 219169
diff --git a/lldb/source/Interpreter/Args.cpp b/lldb/source/Interpreter/Args.cpp
index 4831eaa..682feb9 100644
--- a/lldb/source/Interpreter/Args.cpp
+++ b/lldb/source/Interpreter/Args.cpp
@@ -647,6 +647,20 @@
}
OptionParser::Prepare();
int val;
+
+ // Before parsing arguments, insert quote char to the head of the string.
+ // So quoted arguments like "-l" won't be treated as option.
+ int argv_iter = 0;
+ for (auto args_iter = m_args.begin(); args_iter != m_args.end(); args_iter++, argv_iter++)
+ {
+ char quote_char = GetArgumentQuoteCharAtIndex(argv_iter);
+ if (quote_char != '\0')
+ {
+ *args_iter = std::string(1, quote_char) + *args_iter;
+ m_argv[argv_iter] = args_iter->c_str();
+ }
+ }
+
while (1)
{
int long_options_index = -1;
@@ -696,8 +710,23 @@
}
else
{
+ const char *value = OptionParser::GetOptionArgument();
+ if (value)
+ {
+ // Remove leading quote char from option value
+ argv_iter = 0;
+ for (auto args_iter = m_args.begin(); args_iter != m_args.end(); args_iter++, argv_iter++)
+ {
+ if (*args_iter == value && GetArgumentQuoteCharAtIndex(argv_iter) != '\0')
+ {
+ *args_iter = args_iter->substr(1);
+ value = args_iter->c_str();
+ break;
+ }
+ }
+ }
error = options.SetOptionValue(long_options_index,
- (def->option_has_arg == OptionParser::eNoArgument) ? nullptr : OptionParser::GetOptionArgument());
+ (def->option_has_arg == OptionParser::eNoArgument) ? nullptr : value);
}
}
else
@@ -711,6 +740,19 @@
// Update our ARGV now that get options has consumed all the options
m_argv.erase(m_argv.begin(), m_argv.begin() + OptionParser::GetOptionIndex());
UpdateArgsAfterOptionParsing ();
+
+ // Remove leading quote char from other arguments.
+ argv_iter = 0;
+ for (auto args_iter = m_args.begin(); args_iter != m_args.end(); args_iter++, argv_iter++)
+ {
+ char quote_char = GetArgumentQuoteCharAtIndex(argv_iter);
+ if (quote_char != '\0')
+ {
+ *args_iter = args_iter->substr(1);
+ m_argv[argv_iter] = args_iter->c_str();
+ }
+ }
+
return error;
}