[debuginfo-tests] 4b55102 - [dexter] Change --source-root-dir and add --debugger-use-relative-paths
via llvm-commits
llvm-commits at lists.llvm.org
Tue May 25 05:28:48 PDT 2021
Author: OCHyams
Date: 2021-05-25T13:28:06+01:00
New Revision: 4b55102aff29f5ce82b38a9e4a819b959e29ecd7
URL: https://github.com/llvm/llvm-project/commit/4b55102aff29f5ce82b38a9e4a819b959e29ecd7
DIFF: https://github.com/llvm/llvm-project/commit/4b55102aff29f5ce82b38a9e4a819b959e29ecd7.diff
LOG: [dexter] Change --source-root-dir and add --debugger-use-relative-paths
We want to use `DexDeclareFile` to specify paths relative to a project root
directory. The option `--source-root-dir`, prior to this patch, causes dexter
to strip the path prefix from commands before passing them to a debugger, and
appends the prefix to file paths returned from a debugger. This patch changes
the behviour of `--source-root-dir`. Relative paths in commands, made possible
with `DexDeclareFile(relative/path)`, are appended to the `--source-root-dir`
directory.
A new option, `--debugger-use-relative-paths`, can be used alongside
`--source-root-dir` to reproduce the old behaviour: all paths passed to the
debugger will be made relative to `--source-root-dir`.
I've added a regression test source_root_dir.dex for this new behaviour, and
modified the existing `--source-root-dir` regression and unit tests to use
`--debugger-use-relative-paths`.
Reviewed By: jmorse
Differential Revision: https://reviews.llvm.org/D100307
Added:
debuginfo-tests/dexter/feature_tests/commands/perfect/dex_declare_file/precompiled_binary_different_dir/dex_commands/source_root_dir.dex
Modified:
debuginfo-tests/dexter/dex/command/ParseCommand.py
debuginfo-tests/dexter/dex/debugger/DebuggerBase.py
debuginfo-tests/dexter/dex/debugger/Debuggers.py
debuginfo-tests/dexter/dex/tools/clang_opt_bisect/Tool.py
debuginfo-tests/dexter/dex/tools/test/Tool.py
debuginfo-tests/dexter/feature_tests/subtools/test/source-root-dir.cpp
Removed:
################################################################################
diff --git a/debuginfo-tests/dexter/dex/command/ParseCommand.py b/debuginfo-tests/dexter/dex/command/ParseCommand.py
index 81e5c6c117f01..85e7a3fb36f5a 100644
--- a/debuginfo-tests/dexter/dex/command/ParseCommand.py
+++ b/debuginfo-tests/dexter/dex/command/ParseCommand.py
@@ -209,7 +209,7 @@ def add_line_label(labels, label, cmd_path, cmd_lineno):
labels[label.eval()] = label.get_line()
-def _find_all_commands_in_file(path, file_lines, valid_commands):
+def _find_all_commands_in_file(path, file_lines, valid_commands, source_root_dir):
labels = {} # dict of {name: line}.
cmd_path = path
declared_files = set()
@@ -278,7 +278,8 @@ def _find_all_commands_in_file(path, file_lines, valid_commands):
elif type(command) is DexDeclareFile:
cmd_path = command.declared_file
if not os.path.isabs(cmd_path):
- source_dir = os.path.dirname(path)
+ source_dir = (source_root_dir if source_root_dir else
+ os.path.dirname(path))
cmd_path = os.path.join(source_dir, cmd_path)
# TODO: keep stored paths as PurePaths for 'longer'.
cmd_path = str(PurePath(cmd_path))
@@ -295,25 +296,25 @@ def _find_all_commands_in_file(path, file_lines, valid_commands):
raise format_parse_err(msg, path, file_lines, err_point)
return dict(commands), declared_files
-def _find_all_commands(test_files):
+def _find_all_commands(test_files, source_root_dir):
commands = defaultdict(dict)
valid_commands = _get_valid_commands()
new_source_files = set()
for test_file in test_files:
with open(test_file) as fp:
lines = fp.readlines()
- file_commands, declared_files = _find_all_commands_in_file(test_file,
- lines, valid_commands)
+ file_commands, declared_files = _find_all_commands_in_file(
+ test_file, lines, valid_commands, source_root_dir)
for command_name in file_commands:
commands[command_name].update(file_commands[command_name])
new_source_files |= declared_files
return dict(commands), new_source_files
-def get_command_infos(test_files):
+def get_command_infos(test_files, source_root_dir):
with Timer('parsing commands'):
try:
- commands, new_source_files = _find_all_commands(test_files)
+ commands, new_source_files = _find_all_commands(test_files, source_root_dir)
command_infos = OrderedDict()
for command_type in commands:
for command in commands[command_type].values():
@@ -358,7 +359,7 @@ def _find_all_commands_in_lines(self, lines):
Returns:
{ cmd_name: { (path, line): command_obj } }
"""
- cmds, declared_files = _find_all_commands_in_file(__file__, lines, self.valid_commands)
+ cmds, declared_files = _find_all_commands_in_file(__file__, lines, self.valid_commands, None)
return cmds
diff --git a/debuginfo-tests/dexter/dex/debugger/DebuggerBase.py b/debuginfo-tests/dexter/dex/debugger/DebuggerBase.py
index 5b97974674a5c..c31be774d0fa0 100644
--- a/debuginfo-tests/dexter/dex/debugger/DebuggerBase.py
+++ b/debuginfo-tests/dexter/dex/debugger/DebuggerBase.py
@@ -206,6 +206,8 @@ def evaluate_expression(self, expression, frame_idx=0) -> ValueIR:
pass
def _external_to_debug_path(self, path):
+ if not self.options.debugger_use_relative_paths:
+ return path
root_dir = self.options.source_root_dir
if not root_dir or not path:
return path
@@ -213,6 +215,8 @@ def _external_to_debug_path(self, path):
return path[len(root_dir):].lstrip(os.path.sep)
def _debug_to_external_path(self, path):
+ if not self.options.debugger_use_relative_paths:
+ return path
if not path or not self.options.source_root_dir:
return path
for file in self.options.source_files:
@@ -255,32 +259,38 @@ def _step_paths(self, step):
return [frame.loc.path for frame in step.frames]
def test_add_breakpoint_no_source_root_dir(self):
+ self.options.debugger_use_relative_paths = True
self.options.source_root_dir = ''
self.dbg.add_breakpoint('/root/some_file', 12)
self.assertEqual('/root/some_file', self.dbg.breakpoint_file)
def test_add_breakpoint_with_source_root_dir(self):
+ self.options.debugger_use_relative_paths = True
self.options.source_root_dir = '/my_root'
self.dbg.add_breakpoint('/my_root/some_file', 12)
self.assertEqual('some_file', self.dbg.breakpoint_file)
def test_add_breakpoint_with_source_root_dir_slash_suffix(self):
+ self.options.debugger_use_relative_paths = True
self.options.source_root_dir = '/my_root/'
self.dbg.add_breakpoint('/my_root/some_file', 12)
self.assertEqual('some_file', self.dbg.breakpoint_file)
def test_get_step_info_no_source_root_dir(self):
+ self.options.debugger_use_relative_paths = True
self.dbg.step_info = self._new_step(['/root/some_file'])
self.assertEqual(['/root/some_file'],
self._step_paths(self.dbg.get_step_info([], 0)))
def test_get_step_info_no_frames(self):
+ self.options.debugger_use_relative_paths = True
self.options.source_root_dir = '/my_root'
self.dbg.step_info = self._new_step([])
self.assertEqual([],
self._step_paths(self.dbg.get_step_info([], 0)))
def test_get_step_info(self):
+ self.options.debugger_use_relative_paths = True
self.options.source_root_dir = '/my_root'
self.options.source_files = ['/my_root/some_file']
self.dbg.step_info = self._new_step(
diff --git a/debuginfo-tests/dexter/dex/debugger/Debuggers.py b/debuginfo-tests/dexter/dex/debugger/Debuggers.py
index 1fa433de445c8..fbfa629faf8b2 100644
--- a/debuginfo-tests/dexter/dex/debugger/Debuggers.py
+++ b/debuginfo-tests/dexter/dex/debugger/Debuggers.py
@@ -105,9 +105,15 @@ def add_debugger_tool_arguments(parser, context, defaults):
defaults.source_root_dir = ''
parser.add_argument(
'--source-root-dir',
+ type=str,
+ metavar='<directory>',
default=None,
- help='prefix path to ignore when matching debug info and source files.')
-
+ help='source root directory')
+ parser.add_argument(
+ '--debugger-use-relative-paths',
+ action='store_true',
+ default=False,
+ help='pass the debugger paths relative to --source-root-dir')
def handle_debugger_tool_base_options(context, defaults): # noqa
options = context.options
@@ -141,6 +147,15 @@ def handle_debugger_tool_options(context, defaults): # noqa
if options.debugger == 'lldb':
_warn_meaningless_option(context, '--show-debugger')
+ if options.source_root_dir != None:
+ if not os.path.isabs(options.source_root_dir):
+ raise ToolArgumentError(f'<d>--source-root-dir: expected absolute path, got</> <r>"{options.source_root_dir}"</>')
+ if not os.path.isdir(options.source_root_dir):
+ raise ToolArgumentError(f'<d>--source-root-dir: could not find directory</> <r>"{options.source_root_dir}"</>')
+
+ if options.debugger_use_relative_paths:
+ if not options.source_root_dir:
+ raise ToolArgumentError(f'<d>--debugger-relative-paths</> <r>requires --source-root-dir</>')
def run_debugger_subprocess(debugger_controller, working_dir_path):
with NamedTemporaryFile(
diff --git a/debuginfo-tests/dexter/dex/tools/clang_opt_bisect/Tool.py b/debuginfo-tests/dexter/dex/tools/clang_opt_bisect/Tool.py
index c910d9c537ca1..414f3d18dab8f 100644
--- a/debuginfo-tests/dexter/dex/tools/clang_opt_bisect/Tool.py
+++ b/debuginfo-tests/dexter/dex/tools/clang_opt_bisect/Tool.py
@@ -92,9 +92,11 @@ def _init_debugger_controller(self):
executable_path=self.context.options.executable,
source_paths=self.context.options.source_files,
dexter_version=self.context.version)
+
step_collection.commands, new_source_files = get_command_infos(
- self.context.options.test_files)
+ self.context.options.source_files, self.context.options.source_root_dir)
self.context.options.source_files.extend(list(new_source_files))
+
debugger_controller = DefaultController(self.context, step_collection)
return debugger_controller
diff --git a/debuginfo-tests/dexter/dex/tools/test/Tool.py b/debuginfo-tests/dexter/dex/tools/test/Tool.py
index 2d3ddce8f7b66..1456d6e66db92 100644
--- a/debuginfo-tests/dexter/dex/tools/test/Tool.py
+++ b/debuginfo-tests/dexter/dex/tools/test/Tool.py
@@ -139,7 +139,7 @@ def _init_debugger_controller(self):
dexter_version=self.context.version)
step_collection.commands, new_source_files = get_command_infos(
- self.context.options.test_files)
+ self.context.options.test_files, self.context.options.source_root_dir)
self.context.options.source_files.extend(list(new_source_files))
diff --git a/debuginfo-tests/dexter/feature_tests/commands/perfect/dex_declare_file/precompiled_binary_
diff erent_dir/dex_commands/source_root_dir.dex b/debuginfo-tests/dexter/feature_tests/commands/perfect/dex_declare_file/precompiled_binary_
diff erent_dir/dex_commands/source_root_dir.dex
new file mode 100644
index 0000000000000..466b827c2c2d1
--- /dev/null
+++ b/debuginfo-tests/dexter/feature_tests/commands/perfect/dex_declare_file/precompiled_binary_
diff erent_dir/dex_commands/source_root_dir.dex
@@ -0,0 +1,23 @@
+## Purpose:
+## Check that \DexDeclareFile's file declaration can be made relative to the
+## --source-root-dir path.
+
+# REQUIRES: lldb
+# UNSUPPORTED: system-darwin
+
+# RUN: %clang %S/../source/test.cpp -O0 -g -o %t
+# RUN: %dexter_regression_test --binary %t \
+# RUN: --source-root-dir="%S/../source" -- %s | FileCheck %s
+# RUN: rm %t
+
+# CHECK: source_root_dir.dex: (1.0000)
+
+## ../source/test.cpp
+## 1. int main() {
+## 2. int result = 0;
+## 3. return result;
+## 4. }
+
+## test.cpp is found in ../source, which we set as the source-root-dir.
+DexDeclareFile('test.cpp')
+DexExpectWatchValue('result', 0, on_line=3)
diff --git a/debuginfo-tests/dexter/feature_tests/subtools/test/source-root-dir.cpp b/debuginfo-tests/dexter/feature_tests/subtools/test/source-root-dir.cpp
index 41adf613f6142..d589fbc4cd0d9 100644
--- a/debuginfo-tests/dexter/feature_tests/subtools/test/source-root-dir.cpp
+++ b/debuginfo-tests/dexter/feature_tests/subtools/test/source-root-dir.cpp
@@ -4,7 +4,7 @@
// RUN: %dexter --fail-lt 1.0 -w \
// RUN: --builder 'clang' --debugger 'lldb' \
// RUN: --cflags "-O0 -glldb -fdebug-prefix-map=%S=/changed" \
-// RUN: --source-root-dir=%S -- %s
+// RUN: --source-root-dir=%S --debugger-use-relative-paths -- %s
#include <stdio.h>
int main() {
More information about the llvm-commits
mailing list