1//===- FileLineColLocBreakpointManager.cpp - MLIR Optimizer Driver --------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "mlir/Debug/BreakpointManagers/FileLineColLocBreakpointManager.h"
10#include "mlir/IR/Diagnostics.h"
11#include "llvm/Support/raw_ostream.h"
12
13using namespace mlir;
14using namespace mlir::tracing;
15
16FailureOr<std::tuple<StringRef, int64_t, int64_t>>
17FileLineColLocBreakpoint::parseFromString(StringRef str,
18 function_ref<void(Twine)> diag) {
19 // Watch at debug locations arguments are expected to be in the form:
20 // `fileName:line:col`, `fileName:line`, or `fileName`.
21
22 if (str.empty()) {
23 if (diag)
24 diag("error: initializing FileLineColLocBreakpoint with empty file name");
25 return failure();
26 }
27
28 // This logic is complex because on Windows `:` is a comment valid path
29 // character: `C:\...`.
30 auto [fileLine, colStr] = str.rsplit(Separator: ':');
31 auto [file, lineStr] = fileLine.rsplit(Separator: ':');
32 // Extract the line and column value
33 int64_t line = -1, col = -1;
34 if (lineStr.empty()) {
35 // No candidate for line number, try to use the column string as line
36 // instead.
37 file = fileLine;
38 if (!colStr.empty() && colStr.getAsInteger(Radix: 0, Result&: line))
39 file = str;
40 } else {
41 if (lineStr.getAsInteger(Radix: 0, Result&: line)) {
42 // Failed to parse a line number, try to use the column string as line
43 // instead. If this failed as well, the entire string is the file name.
44 file = fileLine;
45 if (colStr.getAsInteger(Radix: 0, Result&: line))
46 file = str;
47 } else {
48 // We successfully parsed a line number, try to parse the column number.
49 // This shouldn't fail, or the entire string is the file name.
50 if (colStr.getAsInteger(Radix: 0, Result&: col)) {
51 file = str;
52 line = -1;
53 }
54 }
55 }
56 return std::tuple<StringRef, int64_t, int64_t>{file, line, col};
57}
58

source code of mlir/lib/Debug/BreakpointManagers/FileLineColLocBreakpointManager.cpp