| //===- FileLineColLocBreakpointManager.cpp - MLIR Optimizer Driver --------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "mlir/Debug/BreakpointManagers/FileLineColLocBreakpointManager.h" |
| |
| using namespace mlir; |
| using namespace mlir::tracing; |
| |
| FailureOr<std::tuple<StringRef, int64_t, int64_t>> |
| FileLineColLocBreakpoint::parseFromString(StringRef str, |
| function_ref<void(Twine)> diag) { |
| // Watch at debug locations arguments are expected to be in the form: |
| // `fileName:line:col`, `fileName:line`, or `fileName`. |
| |
| if (str.empty()) { |
| if (diag) |
| diag("error: initializing FileLineColLocBreakpoint with empty file name"); |
| return failure(); |
| } |
| |
| // This logic is complex because on Windows `:` is a comment valid path |
| // character: `C:\...`. |
| auto [fileLine, colStr] = str.rsplit(':'); |
| auto [file, lineStr] = fileLine.rsplit(':'); |
| // Extract the line and column value |
| int64_t line = -1, col = -1; |
| if (lineStr.empty()) { |
| // No candidate for line number, try to use the column string as line |
| // instead. |
| file = fileLine; |
| if (!colStr.empty() && colStr.getAsInteger(0, line)) |
| file = str; |
| } else { |
| if (lineStr.getAsInteger(0, line)) { |
| // Failed to parse a line number, try to use the column string as line |
| // instead. If this failed as well, the entire string is the file name. |
| file = fileLine; |
| if (colStr.getAsInteger(0, line)) |
| file = str; |
| } else { |
| // We successfully parsed a line number, try to parse the column number. |
| // This shouldn't fail, or the entire string is the file name. |
| if (colStr.getAsInteger(0, col)) { |
| file = str; |
| line = -1; |
| } |
| } |
| } |
| return std::tuple<StringRef, int64_t, int64_t>{file, line, col}; |
| } |