xref: /llvm-project/offload/include/Shared/SourceInfo.h (revision 330d8983d25d08580fc1642fea48b2473f47a9da)
1*330d8983SJohannes Doerfert //===-- SharedSourceInfo.h - Target independent OpenMP target RTL - C++ -*-===//
2*330d8983SJohannes Doerfert //
3*330d8983SJohannes Doerfert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*330d8983SJohannes Doerfert // See https://llvm.org/LICENSE.txt for license information.
5*330d8983SJohannes Doerfert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*330d8983SJohannes Doerfert //
7*330d8983SJohannes Doerfert //===----------------------------------------------------------------------===//
8*330d8983SJohannes Doerfert //
9*330d8983SJohannes Doerfert // Methods used to describe source information in target regions
10*330d8983SJohannes Doerfert //
11*330d8983SJohannes Doerfert //===----------------------------------------------------------------------===//
12*330d8983SJohannes Doerfert 
13*330d8983SJohannes Doerfert #ifndef OMPTARGET_SHARED_SOURCE_INFO_H
14*330d8983SJohannes Doerfert #define OMPTARGET_SHARED_SOURCE_INFO_H
15*330d8983SJohannes Doerfert 
16*330d8983SJohannes Doerfert #include <cstdint>
17*330d8983SJohannes Doerfert #include <string>
18*330d8983SJohannes Doerfert 
19*330d8983SJohannes Doerfert #ifdef _WIN32
20*330d8983SJohannes Doerfert constexpr bool OSWindows = true;
21*330d8983SJohannes Doerfert #else
22*330d8983SJohannes Doerfert constexpr bool OSWindows = false;
23*330d8983SJohannes Doerfert #endif
24*330d8983SJohannes Doerfert 
25*330d8983SJohannes Doerfert /// Type alias for source location information for variable mappings with
26*330d8983SJohannes Doerfert /// data layout ";name;filename;row;col;;\0" from clang.
27*330d8983SJohannes Doerfert using map_var_info_t = void *;
28*330d8983SJohannes Doerfert 
29*330d8983SJohannes Doerfert /// The ident structure that describes a source location from kmp.h. with
30*330d8983SJohannes Doerfert /// source location string data as ";filename;function;line;column;;\0".
31*330d8983SJohannes Doerfert struct ident_t {
32*330d8983SJohannes Doerfert   // Ident_t flags described in kmp.h.
33*330d8983SJohannes Doerfert   int32_t reserved_1;
34*330d8983SJohannes Doerfert   int32_t flags;
35*330d8983SJohannes Doerfert   int32_t reserved_2;
36*330d8983SJohannes Doerfert   int32_t reserved_3;
37*330d8983SJohannes Doerfert   char const *psource;
38*330d8983SJohannes Doerfert };
39*330d8983SJohannes Doerfert 
40*330d8983SJohannes Doerfert /// Struct to hold source individual location information.
41*330d8983SJohannes Doerfert class SourceInfo {
42*330d8983SJohannes Doerfert   /// Underlying string copy of the original source information.
43*330d8983SJohannes Doerfert   const std::string SourceStr;
44*330d8983SJohannes Doerfert 
45*330d8983SJohannes Doerfert   /// Location fields extracted from the source information string.
46*330d8983SJohannes Doerfert   const std::string Name;
47*330d8983SJohannes Doerfert   const std::string Filename;
48*330d8983SJohannes Doerfert   const int32_t Line;
49*330d8983SJohannes Doerfert   const int32_t Column;
50*330d8983SJohannes Doerfert 
initStr(const void * Name)51*330d8983SJohannes Doerfert   std::string initStr(const void *Name) {
52*330d8983SJohannes Doerfert     if (!Name)
53*330d8983SJohannes Doerfert       return ";unknown;unknown;0;0;;";
54*330d8983SJohannes Doerfert 
55*330d8983SJohannes Doerfert     std::string Str = std::string(reinterpret_cast<const char *>(Name));
56*330d8983SJohannes Doerfert     if (Str.find(';') == std::string::npos)
57*330d8983SJohannes Doerfert       return ";" + Str + ";unknown;0;0;;";
58*330d8983SJohannes Doerfert     return Str;
59*330d8983SJohannes Doerfert   }
60*330d8983SJohannes Doerfert 
initStr(const ident_t * Loc)61*330d8983SJohannes Doerfert   std::string initStr(const ident_t *Loc) {
62*330d8983SJohannes Doerfert     if (!Loc)
63*330d8983SJohannes Doerfert       return ";unknown;unknown;0;0;;";
64*330d8983SJohannes Doerfert     return std::string(reinterpret_cast<const char *>(Loc->psource));
65*330d8983SJohannes Doerfert   }
66*330d8983SJohannes Doerfert 
67*330d8983SJohannes Doerfert   /// Get n-th substring in an expression separated by ;.
getSubstring(const unsigned N)68*330d8983SJohannes Doerfert   std::string getSubstring(const unsigned N) const {
69*330d8983SJohannes Doerfert     std::size_t Begin = SourceStr.find(';');
70*330d8983SJohannes Doerfert     std::size_t End = SourceStr.find(';', Begin + 1);
71*330d8983SJohannes Doerfert     for (unsigned I = 0; I < N; I++) {
72*330d8983SJohannes Doerfert       Begin = End;
73*330d8983SJohannes Doerfert       End = SourceStr.find(';', Begin + 1);
74*330d8983SJohannes Doerfert     }
75*330d8983SJohannes Doerfert     return SourceStr.substr(Begin + 1, End - Begin - 1);
76*330d8983SJohannes Doerfert   };
77*330d8983SJohannes Doerfert 
78*330d8983SJohannes Doerfert   /// Get the filename from a full path.
removePath(const std::string & Path)79*330d8983SJohannes Doerfert   std::string removePath(const std::string &Path) const {
80*330d8983SJohannes Doerfert     std::size_t Pos = (OSWindows) ? Path.rfind('\\') : Path.rfind('/');
81*330d8983SJohannes Doerfert     return Path.substr(Pos + 1);
82*330d8983SJohannes Doerfert   };
83*330d8983SJohannes Doerfert 
84*330d8983SJohannes Doerfert public:
SourceInfo(const ident_t * Loc)85*330d8983SJohannes Doerfert   SourceInfo(const ident_t *Loc)
86*330d8983SJohannes Doerfert       : SourceStr(initStr(Loc)), Name(getSubstring(1)),
87*330d8983SJohannes Doerfert         Filename(removePath(getSubstring(0))), Line(std::stoi(getSubstring(2))),
88*330d8983SJohannes Doerfert         Column(std::stoi(getSubstring(3))) {}
89*330d8983SJohannes Doerfert 
SourceInfo(const map_var_info_t Name)90*330d8983SJohannes Doerfert   SourceInfo(const map_var_info_t Name)
91*330d8983SJohannes Doerfert       : SourceStr(initStr(Name)), Name(getSubstring(0)),
92*330d8983SJohannes Doerfert         Filename(removePath(getSubstring(1))), Line(std::stoi(getSubstring(2))),
93*330d8983SJohannes Doerfert         Column(std::stoi(getSubstring(3))) {}
94*330d8983SJohannes Doerfert 
getName()95*330d8983SJohannes Doerfert   const char *getName() const { return Name.c_str(); }
getFilename()96*330d8983SJohannes Doerfert   const char *getFilename() const { return Filename.c_str(); }
getProfileLocation()97*330d8983SJohannes Doerfert   const char *getProfileLocation() const { return SourceStr.data(); }
getLine()98*330d8983SJohannes Doerfert   int32_t getLine() const { return Line; }
getColumn()99*330d8983SJohannes Doerfert   int32_t getColumn() const { return Column; }
isAvailible()100*330d8983SJohannes Doerfert   bool isAvailible() const { return (Line || Column); }
101*330d8983SJohannes Doerfert };
102*330d8983SJohannes Doerfert 
103*330d8983SJohannes Doerfert /// Standalone function for getting the variable name of a mapping.
getNameFromMapping(const map_var_info_t Name)104*330d8983SJohannes Doerfert static inline std::string getNameFromMapping(const map_var_info_t Name) {
105*330d8983SJohannes Doerfert   if (!Name)
106*330d8983SJohannes Doerfert     return "unknown";
107*330d8983SJohannes Doerfert 
108*330d8983SJohannes Doerfert   const std::string NameStr(reinterpret_cast<const char *>(Name));
109*330d8983SJohannes Doerfert   std::size_t Begin = NameStr.find(';');
110*330d8983SJohannes Doerfert   std::size_t End = NameStr.find(';', Begin + 1);
111*330d8983SJohannes Doerfert   return NameStr.substr(Begin + 1, End - Begin - 1);
112*330d8983SJohannes Doerfert }
113*330d8983SJohannes Doerfert 
114*330d8983SJohannes Doerfert #endif // OMPTARGET_SHARED_SOURCE_INFO_H
115