• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #ifndef PANDA_RUNTIME_PANDA_VM_H
16 #define PANDA_RUNTIME_PANDA_VM_H
17 
18 #include "include/coretypes/string.h"
19 #include "include/runtime_options.h"
20 #include "runtime/include/locks.h"
21 #include "runtime/include/mem/panda_containers.h"
22 #include "runtime/include/mem/panda_string.h"
23 #include "runtime/include/method.h"
24 #include "runtime/include/runtime.h"
25 #include "runtime/mem/gc/gc_phase.h"
26 
27 #include "libpandabase/utils/expected.h"
28 
29 namespace panda {
30 
31 class ManagedThread;
32 class StringTable;
33 class ThreadManager;
34 
35 namespace compiler {
36 class RuntimeInterface;
37 }  // namespace compiler
38 
39 namespace mem {
40 class HeapManager;
41 class GC;
42 class GCTrigger;
43 class ReferenceProcessor;
44 }  // namespace mem
45 
46 enum class PandaVMType : size_t { ECMA_VM };  // Deprecated. Only for Compability with js_runtime.
47 
48 class PandaVM {
49 public:
50     static PandaVM *Create(Runtime *runtime, const RuntimeOptions &options, std::string_view runtimeType);
51 
PandaVM()52     explicit PandaVM() : mutatorLock_(Locks::NewMutatorLock()) {};
53 
54     virtual ~PandaVM() = default;
55 
GetCurrent()56     static PandaVM *GetCurrent()
57     {
58         ASSERT(Thread::GetCurrent() != nullptr);
59         return Thread::GetCurrent()->GetVM();
60     }
61 
ResolveString(const panda_file::File & pf,panda_file::File::EntityId id)62     virtual coretypes::String *ResolveString([[maybe_unused]] const panda_file::File &pf,
63                                              [[maybe_unused]] panda_file::File::EntityId id)
64     {
65         return nullptr;
66     }
67     virtual bool Initialize() = 0;
68     virtual bool InitializeFinish() = 0;
69     virtual void PreStartup() = 0;
70     virtual void PreZygoteFork() = 0;
71     virtual void PostZygoteFork() = 0;
72     virtual void InitializeGC() = 0;
73     virtual void StartGC() = 0;
74     virtual void StopGC() = 0;
75     virtual void VisitVmRoots(const GCRootVisitor &visitor);
76     virtual void UpdateVmRefs();
77     virtual void UninitializeThreads() = 0;
SaveProfileInfo()78     virtual void SaveProfileInfo() {}
79 
80     virtual Expected<int, Runtime::Error> InvokeEntrypoint(Method *entrypoint, const std::vector<std::string> &args);
81 
82     // NOLINTNEXTLINE(performance-unnecessary-value-param)
HandleReferences(const GCTask & task,const mem::GC::ReferenceClearPredicateT & pred)83     virtual void HandleReferences([[maybe_unused]] const GCTask &task,
84                                   [[maybe_unused]] const mem::GC::ReferenceClearPredicateT &pred)
85     {
86     }
HandleEnqueueReferences()87     virtual void HandleEnqueueReferences() {}
HandleGCFinished()88     virtual void HandleGCFinished() {}
89     /*
90      * Handle some vm related routine (e.g. finalization calls) after GC.
91      * Method will be called only in a mutator thread
92      */
HandleGCRoutineInMutator()93     virtual void HandleGCRoutineInMutator() {}
94     virtual void HandleLdaStr(Frame *frame, BytecodeId stringId);
HandleReturnFrame()95     virtual void HandleReturnFrame() {}
96 
97     virtual mem::GCStats *GetGCStats() const = 0;
98     virtual mem::HeapManager *GetHeapManager() const = 0;
99     virtual mem::GC *GetGC() const = 0;
100     virtual mem::GCTrigger *GetGCTrigger() const = 0;
101     virtual const RuntimeOptions &GetOptions() const = 0;
102     virtual ManagedThread *GetAssociatedThread() const = 0;
103     virtual StringTable *GetStringTable() const = 0;
104     virtual mem::MemStatsType *GetMemStats() const = 0;
105     virtual Rendezvous *GetRendezvous() const = 0;
106     virtual mem::GlobalObjectStorage *GetGlobalObjectStorage() const = 0;
107     virtual MonitorPool *GetMonitorPool() const = 0;
108     virtual ThreadManager *GetThreadManager() const = 0;
CreateString(Method * ctor,ObjectHeader * obj)109     virtual coretypes::String *CreateString([[maybe_unused]] Method *ctor, [[maybe_unused]] ObjectHeader *obj)
110     {
111         UNREACHABLE();
112         return nullptr;
113     }
GetCompilerRuntimeInterface()114     virtual compiler::RuntimeInterface *GetCompilerRuntimeInterface() const
115     {
116         return nullptr;
117     }
VisitStringTable(const StringTable::StringVisitor & visitor,mem::VisitGCRootFlags flags)118     virtual void VisitStringTable(const StringTable::StringVisitor &visitor, mem::VisitGCRootFlags flags)
119     {
120         GetStringTable()->VisitRoots(visitor, flags);
121     }
122 
VisitStrings(const StringTable::StringVisitor & visitor)123     virtual void VisitStrings(const StringTable::StringVisitor &visitor)
124     {
125         GetStringTable()->VisitStrings(visitor);
126     }
127 
SweepVmRefs(const GCObjectVisitor & gcObjectVisitor)128     virtual void SweepVmRefs(const GCObjectVisitor &gcObjectVisitor)
129     {
130         GetStringTable()->Sweep(gcObjectVisitor);
131     }
132 
UpdateMovedStrings()133     virtual bool UpdateMovedStrings()
134     {
135         return GetStringTable()->UpdateMoved();
136     }
137 
138     // NOTE(maksenov): remove this method after fixing interpreter performance
GetPandaVMType()139     virtual PandaVMType GetPandaVMType() const
140     {
141         // Deprecated. Only for Compability with js_runtime.
142         return PandaVMType::ECMA_VM;
143     }
144 
145     virtual LanguageContext GetLanguageContext() const = 0;
146     virtual CompilerInterface *GetCompiler() const = 0;
147 
148     virtual panda::mem::ReferenceProcessor *GetReferenceProcessor() const = 0;
149 
150     virtual ObjectHeader *GetOOMErrorObject() = 0;
151 
RegisterSignalHandlers()152     virtual void RegisterSignalHandlers() {};
153 
DumpForSigQuit(std::ostream & os)154     virtual void DumpForSigQuit([[maybe_unused]] std::ostream &os) const {};
155 
156     virtual std::unique_ptr<const panda_file::File> OpenPandaFile(std::string_view location);
157 
ResolveStringFromCompiledCode(const panda_file::File & pf,panda_file::File::EntityId id)158     virtual coretypes::String *ResolveStringFromCompiledCode(const panda_file::File &pf, panda_file::File::EntityId id)
159     {
160         return ResolveString(pf, id);
161     }
162 
ResolveString(Frame * frame,panda_file::File::EntityId id)163     virtual coretypes::String *ResolveString([[maybe_unused]] Frame *frame,
164                                              [[maybe_unused]] panda_file::File::EntityId id)
165     {
166         return nullptr;
167     }
168 
169     virtual coretypes::String *GetNonMovableString(const panda_file::File &pf, panda_file::File::EntityId id) const;
170 
GetFrameExtSize()171     uint32_t GetFrameExtSize() const
172     {
173         return frameExtSize_;
174     }
175 
IsBytecodeProfilingEnabled()176     virtual bool IsBytecodeProfilingEnabled() const
177     {
178         return false;
179     }
180 
CleanUpTask(Method * method)181     virtual void CleanUpTask([[maybe_unused]] Method *method) {};
182 
183     virtual bool ShouldEnableDebug();
184 
IsStaticProfileEnabled()185     virtual bool IsStaticProfileEnabled() const
186     {
187         return false;
188     }
189 
DumpHeap(PandaOStringStream * oStr)190     virtual void DumpHeap(PandaOStringStream *oStr) const
191     {
192         size_t objCnt = 0;
193         *oStr << "Dumping heap" << std::endl;
194         GetHeapManager()->IterateOverObjects([&objCnt, &oStr](ObjectHeader *mem) {
195             DumpObject(mem, oStr);
196             objCnt++;
197         });
198         *oStr << "Total dumped " << objCnt << std::endl;
199     }
200 
201     virtual PandaString GetClassesFootprint() const;
202 
LoadDebuggerAgent()203     void LoadDebuggerAgent()
204     {
205         debuggerAgent_ = CreateDebuggerAgent();
206     }
207 
UnloadDebuggerAgent()208     void UnloadDebuggerAgent()
209     {
210         debuggerAgent_.reset();
211     }
212 
GetMutatorLock()213     MutatorLock *GetMutatorLock()
214     {
215         return mutatorLock_;
216     }
217 
GetMutatorLock()218     const MutatorLock *GetMutatorLock() const
219     {
220         return mutatorLock_;
221     }
222 
223     // Intrusive GC test API
224     void MarkObject(ObjectHeader *obj);
225     void IterateOverMarkQueue(const std::function<void(ObjectHeader *)> &visitor);
226     void ClearMarkQueue();
227 
ClearInteropHandleScopes(Frame * frame)228     virtual void ClearInteropHandleScopes([[maybe_unused]] Frame *frame) {}
229 
230     NO_MOVE_SEMANTIC(PandaVM);
231     NO_COPY_SEMANTIC(PandaVM);
232 
233 protected:
234     virtual bool CheckEntrypointSignature(Method *entrypoint) = 0;
235     virtual Expected<int, Runtime::Error> InvokeEntrypointImpl(Method *entrypoint,
236                                                                const std::vector<std::string> &args) = 0;
237     virtual void HandleUncaughtException() = 0;
238 
SetFrameExtSize(uint32_t size)239     void SetFrameExtSize(uint32_t size)
240     {
241         frameExtSize_ = size;
242     }
243 
244     virtual LoadableAgentHandle CreateDebuggerAgent();
245 
246 private:
247     /// Lock used for preventing object heap modifications (for example at GC<->JIT,ManagedCode interaction during STW)
248     MutatorLock *mutatorLock_;
249     uint32_t frameExtSize_ {EMPTY_EXT_FRAME_DATA_SIZE};
250     LoadableAgentHandle debuggerAgent_;
251 
252     // Intrusive GC test API
253     PandaList<ObjectHeader *> markQueue_ GUARDED_BY(markQueueLock_);
254     os::memory::Mutex markQueueLock_;
255 };
256 
257 }  // namespace panda
258 
259 #endif  // PANDA_RUNTIME_PANDA_VM_H
260