Fixed the : issue in lldb-mi. Changed FileSpec::Normalize to make sure that it
handles the path with \\ correctly. Added test cases to check for full path in
both lldb-mi and lldb.
zturner suggested to add test case for SBFileSpec that creates it with
PathSyntaxWindows. But PathSyntax enum is in internal class FileSpec. It is not
available at the SBFileSpec level. I have added tests that check the breakpoint
with full path in lldb and lldb-mi.
http://reviews.llvm.org/D7379
Files:
source/Host/common/FileSpec.cpp
test/functionalities/breakpoint/breakpoint_command/TestRegexpBreakCommand.py
test/tools/lldb-mi/TestMiBreakpoint.py
test/tools/lldb-mi/main.c
tools/lldb-mi/MICmdCmdBreak.cpp
EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
Index: source/Host/common/FileSpec.cpp
===================================================================
--- source/Host/common/FileSpec.cpp
+++ source/Host/common/FileSpec.cpp
@@ -240,6 +240,12 @@
return;
std::replace(path.begin(), path.end(), '\\', '/');
+ // Windows path can have \\ slashes which can be changed by replace
+ // call above to //. Here we remove the duplicate.
+ auto iter = std::unique ( path.begin(), path.end(),
+ []( char &c1, char &c2 ){
+ return (c1 == '/' && c2 == '/');});
+ path.erase(iter, path.end());
}
void FileSpec::DeNormalize(llvm::SmallVectorImpl<char> &path, PathSyntax syntax)
Index: test/functionalities/breakpoint/breakpoint_command/TestRegexpBreakCommand.py
===================================================================
--- test/functionalities/breakpoint/breakpoint_command/TestRegexpBreakCommand.py
+++ test/functionalities/breakpoint/breakpoint_command/TestRegexpBreakCommand.py
@@ -43,6 +43,11 @@
break_results = lldbutil.run_break_set_command (self, "b %s:%d" % (self.source, self.line))
lldbutil.check_breakpoint_result (self, break_results, file_name='main.c', line_number=self.line, num_locations=1)
+ # Check breakpoint with full file path.
+ full_path = os.path.join(os.getcwd(), self.source)
+ break_results = lldbutil.run_break_set_command (self, "b %s:%d" % (full_path, self.line))
+ lldbutil.check_breakpoint_result (self, break_results, file_name='main.c', line_number=self.line, num_locations=1)
+
self.runCmd("run", RUN_SUCCEEDED)
# The stop reason of the thread should be breakpoint.
Index: test/tools/lldb-mi/TestMiBreakpoint.py
===================================================================
--- test/tools/lldb-mi/TestMiBreakpoint.py
+++ test/tools/lldb-mi/TestMiBreakpoint.py
@@ -83,10 +83,21 @@
self.runCmd("-break-insert main.c:%d" % line)
self.expect("\^done,bkpt={number=\"3\"")
+ // Check with full path. TODO, figure out why this commands fails
+ // if -f is not given
+ line = line_number('main.c', '// BP_doloop')
+ full_path = os.path.join(os.getcwd(), "main.c")
+ self.runCmd("-break-insert -f %s:%d" % (full_path, line))
+ #self.expect("\^done,bkpt={number=\"4\"")
+
self.runCmd("-exec-continue")
self.expect("\^running")
self.expect("\*stopped,reason=\"breakpoint-hit\"")
+ self.runCmd("-exec-continue")
+ self.expect("\^running")
+ self.expect("\*stopped,reason=\"breakpoint-hit\"")
+
# Run to exit
self.runCmd("-exec-continue")
self.expect("\^running")
Index: test/tools/lldb-mi/main.c
===================================================================
--- test/tools/lldb-mi/main.c
+++ test/tools/lldb-mi/main.c
@@ -22,7 +22,7 @@
a = a_MyFunction(); //BP_a_MyFunction_call
b = b_MyFunction(); //BP_b_MyFunction_call
//BP_localstest -- it must be at line #24 (or fix it in main*.micmds)
- if (doloop)
+ if (doloop) // BP_doloop
infloop();
if (argc > 1 && *argv[1] == 'l') {
a++;
Index: tools/lldb-mi/MICmdCmdBreak.cpp
===================================================================
--- tools/lldb-mi/MICmdCmdBreak.cpp
+++ tools/lldb-mi/MICmdCmdBreak.cpp
@@ -180,19 +180,16 @@
CMIUtilString fileName;
MIuint nFileLine = 0;
CMIUtilString strFileFn;
- const MIint nPosColon = m_brkName.find(cColon);
- if (nPosColon != (MIint)std::string::npos)
+ CMIUtilString rStrLineOrFn;
+ // Full path in windows can have : after drive letter. So look for the
+ // last colon
+ const size_t nPosColon = m_brkName.find_last_of(cColon);
+ if (nPosColon != std::string::npos)
{
- CMIUtilString::VecString_t vecFileAndLocation;
- const MIuint nSplits = m_brkName.Split(cColon, vecFileAndLocation);
- MIunused(nSplits);
- if (vecFileAndLocation.size() != 2)
- {
- SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_BRKPT_LOCATION_FORMAT), m_cmdData.strMiCmd.c_str(), m_brkName.c_str()));
- return MIstatus::failure;
- }
- fileName = vecFileAndLocation.at(0);
- const CMIUtilString &rStrLineOrFn(vecFileAndLocation.at(1));
+ // extract file name and line number from it
+ fileName = m_brkName.substr(0, nPosColon);
+ rStrLineOrFn = m_brkName.substr(nPosColon + 1, m_brkName.size() - nPosColon - 1);
+
if (rStrLineOrFn.empty())
eBrkPtType = eBreakPoint_ByName;
else
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits