1*03ce13f7SAndroid Build Coastguard Worker // Copyright 2019 The SwiftShader Authors. All Rights Reserved.
2*03ce13f7SAndroid Build Coastguard Worker //
3*03ce13f7SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*03ce13f7SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*03ce13f7SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*03ce13f7SAndroid Build Coastguard Worker //
7*03ce13f7SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0
8*03ce13f7SAndroid Build Coastguard Worker //
9*03ce13f7SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*03ce13f7SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*03ce13f7SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*03ce13f7SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*03ce13f7SAndroid Build Coastguard Worker // limitations under the License.
14*03ce13f7SAndroid Build Coastguard Worker
15*03ce13f7SAndroid Build Coastguard Worker #include "File.hpp"
16*03ce13f7SAndroid Build Coastguard Worker
17*03ce13f7SAndroid Build Coastguard Worker #include "marl/mutex.h"
18*03ce13f7SAndroid Build Coastguard Worker
19*03ce13f7SAndroid Build Coastguard Worker namespace {
20*03ce13f7SAndroid Build Coastguard Worker
21*03ce13f7SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
22*03ce13f7SAndroid Build Coastguard Worker // FileBase
23*03ce13f7SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
24*03ce13f7SAndroid Build Coastguard Worker class FileBase : public vk::dbg::File
25*03ce13f7SAndroid Build Coastguard Worker {
26*03ce13f7SAndroid Build Coastguard Worker public:
27*03ce13f7SAndroid Build Coastguard Worker void clearBreakpoints() override;
28*03ce13f7SAndroid Build Coastguard Worker void addBreakpoint(int line) override;
29*03ce13f7SAndroid Build Coastguard Worker bool hasBreakpoint(int line) const override;
30*03ce13f7SAndroid Build Coastguard Worker std::unordered_set<int> getBreakpoints() const override;
31*03ce13f7SAndroid Build Coastguard Worker
32*03ce13f7SAndroid Build Coastguard Worker protected:
33*03ce13f7SAndroid Build Coastguard Worker FileBase(ID id, std::string dir, std::string name, std::string source);
34*03ce13f7SAndroid Build Coastguard Worker
35*03ce13f7SAndroid Build Coastguard Worker private:
36*03ce13f7SAndroid Build Coastguard Worker mutable marl::mutex breakpointMutex;
37*03ce13f7SAndroid Build Coastguard Worker std::unordered_set<int> breakpoints GUARDED_BY(breakpointMutex);
38*03ce13f7SAndroid Build Coastguard Worker };
39*03ce13f7SAndroid Build Coastguard Worker
FileBase(ID id,std::string dir,std::string name,std::string source)40*03ce13f7SAndroid Build Coastguard Worker FileBase::FileBase(ID id, std::string dir, std::string name, std::string source)
41*03ce13f7SAndroid Build Coastguard Worker : File(id, std::move(dir), std::move(name), std::move(source))
42*03ce13f7SAndroid Build Coastguard Worker {}
43*03ce13f7SAndroid Build Coastguard Worker
clearBreakpoints()44*03ce13f7SAndroid Build Coastguard Worker void FileBase::clearBreakpoints()
45*03ce13f7SAndroid Build Coastguard Worker {
46*03ce13f7SAndroid Build Coastguard Worker marl::lock lock(breakpointMutex);
47*03ce13f7SAndroid Build Coastguard Worker breakpoints.clear();
48*03ce13f7SAndroid Build Coastguard Worker }
49*03ce13f7SAndroid Build Coastguard Worker
addBreakpoint(int line)50*03ce13f7SAndroid Build Coastguard Worker void FileBase::addBreakpoint(int line)
51*03ce13f7SAndroid Build Coastguard Worker {
52*03ce13f7SAndroid Build Coastguard Worker marl::lock lock(breakpointMutex);
53*03ce13f7SAndroid Build Coastguard Worker breakpoints.emplace(line);
54*03ce13f7SAndroid Build Coastguard Worker }
55*03ce13f7SAndroid Build Coastguard Worker
hasBreakpoint(int line) const56*03ce13f7SAndroid Build Coastguard Worker bool FileBase::hasBreakpoint(int line) const
57*03ce13f7SAndroid Build Coastguard Worker {
58*03ce13f7SAndroid Build Coastguard Worker marl::lock lock(breakpointMutex);
59*03ce13f7SAndroid Build Coastguard Worker return breakpoints.count(line) > 0;
60*03ce13f7SAndroid Build Coastguard Worker }
61*03ce13f7SAndroid Build Coastguard Worker
getBreakpoints() const62*03ce13f7SAndroid Build Coastguard Worker std::unordered_set<int> FileBase::getBreakpoints() const
63*03ce13f7SAndroid Build Coastguard Worker {
64*03ce13f7SAndroid Build Coastguard Worker marl::lock lock(breakpointMutex);
65*03ce13f7SAndroid Build Coastguard Worker return breakpoints;
66*03ce13f7SAndroid Build Coastguard Worker }
67*03ce13f7SAndroid Build Coastguard Worker
68*03ce13f7SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
69*03ce13f7SAndroid Build Coastguard Worker // VirtualFile
70*03ce13f7SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
71*03ce13f7SAndroid Build Coastguard Worker class VirtualFile : public FileBase
72*03ce13f7SAndroid Build Coastguard Worker {
73*03ce13f7SAndroid Build Coastguard Worker public:
74*03ce13f7SAndroid Build Coastguard Worker VirtualFile(ID id, std::string name, std::string source);
75*03ce13f7SAndroid Build Coastguard Worker
76*03ce13f7SAndroid Build Coastguard Worker bool isVirtual() const override;
77*03ce13f7SAndroid Build Coastguard Worker
78*03ce13f7SAndroid Build Coastguard Worker private:
79*03ce13f7SAndroid Build Coastguard Worker };
80*03ce13f7SAndroid Build Coastguard Worker
VirtualFile(ID id,std::string name,std::string source)81*03ce13f7SAndroid Build Coastguard Worker VirtualFile::VirtualFile(ID id, std::string name, std::string source)
82*03ce13f7SAndroid Build Coastguard Worker : FileBase(id, "", std::move(name), std::move(source))
83*03ce13f7SAndroid Build Coastguard Worker {}
84*03ce13f7SAndroid Build Coastguard Worker
isVirtual() const85*03ce13f7SAndroid Build Coastguard Worker bool VirtualFile::isVirtual() const
86*03ce13f7SAndroid Build Coastguard Worker {
87*03ce13f7SAndroid Build Coastguard Worker return true;
88*03ce13f7SAndroid Build Coastguard Worker }
89*03ce13f7SAndroid Build Coastguard Worker
90*03ce13f7SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
91*03ce13f7SAndroid Build Coastguard Worker // PhysicalFile
92*03ce13f7SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
93*03ce13f7SAndroid Build Coastguard Worker struct PhysicalFile : public FileBase
94*03ce13f7SAndroid Build Coastguard Worker {
95*03ce13f7SAndroid Build Coastguard Worker PhysicalFile(ID id,
96*03ce13f7SAndroid Build Coastguard Worker std::string dir,
97*03ce13f7SAndroid Build Coastguard Worker std::string name);
98*03ce13f7SAndroid Build Coastguard Worker
99*03ce13f7SAndroid Build Coastguard Worker bool isVirtual() const override;
100*03ce13f7SAndroid Build Coastguard Worker };
101*03ce13f7SAndroid Build Coastguard Worker
PhysicalFile(ID id,std::string dir,std::string name)102*03ce13f7SAndroid Build Coastguard Worker PhysicalFile::PhysicalFile(ID id,
103*03ce13f7SAndroid Build Coastguard Worker std::string dir,
104*03ce13f7SAndroid Build Coastguard Worker std::string name)
105*03ce13f7SAndroid Build Coastguard Worker : FileBase(id, std::move(dir), std::move(name), "")
106*03ce13f7SAndroid Build Coastguard Worker {}
107*03ce13f7SAndroid Build Coastguard Worker
isVirtual() const108*03ce13f7SAndroid Build Coastguard Worker bool PhysicalFile::isVirtual() const
109*03ce13f7SAndroid Build Coastguard Worker {
110*03ce13f7SAndroid Build Coastguard Worker return false;
111*03ce13f7SAndroid Build Coastguard Worker }
112*03ce13f7SAndroid Build Coastguard Worker
113*03ce13f7SAndroid Build Coastguard Worker } // anonymous namespace
114*03ce13f7SAndroid Build Coastguard Worker
115*03ce13f7SAndroid Build Coastguard Worker namespace vk {
116*03ce13f7SAndroid Build Coastguard Worker namespace dbg {
117*03ce13f7SAndroid Build Coastguard Worker
createVirtual(ID id,std::string name,std::string source)118*03ce13f7SAndroid Build Coastguard Worker std::shared_ptr<File> File::createVirtual(ID id, std::string name, std::string source)
119*03ce13f7SAndroid Build Coastguard Worker {
120*03ce13f7SAndroid Build Coastguard Worker return std::make_shared<VirtualFile>(id, std::move(name), std::move(source));
121*03ce13f7SAndroid Build Coastguard Worker }
122*03ce13f7SAndroid Build Coastguard Worker
createPhysical(ID id,std::string path)123*03ce13f7SAndroid Build Coastguard Worker std::shared_ptr<File> File::createPhysical(ID id, std::string path)
124*03ce13f7SAndroid Build Coastguard Worker {
125*03ce13f7SAndroid Build Coastguard Worker auto pathstr = path;
126*03ce13f7SAndroid Build Coastguard Worker auto pos = pathstr.rfind("/");
127*03ce13f7SAndroid Build Coastguard Worker if(pos != std::string::npos)
128*03ce13f7SAndroid Build Coastguard Worker {
129*03ce13f7SAndroid Build Coastguard Worker auto dir = pathstr.substr(0, pos);
130*03ce13f7SAndroid Build Coastguard Worker auto name = pathstr.substr(pos + 1);
131*03ce13f7SAndroid Build Coastguard Worker return std::make_shared<PhysicalFile>(id, dir.c_str(), name.c_str());
132*03ce13f7SAndroid Build Coastguard Worker }
133*03ce13f7SAndroid Build Coastguard Worker return std::make_shared<PhysicalFile>(id, "", std::move(path));
134*03ce13f7SAndroid Build Coastguard Worker }
135*03ce13f7SAndroid Build Coastguard Worker
136*03ce13f7SAndroid Build Coastguard Worker } // namespace dbg
137*03ce13f7SAndroid Build Coastguard Worker } // namespace vk
138