14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License.
54514f5e3Sopenharmony_ci * You may obtain a copy of the License at
64514f5e3Sopenharmony_ci *
74514f5e3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
84514f5e3Sopenharmony_ci *
94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and
134514f5e3Sopenharmony_ci * limitations under the License.
144514f5e3Sopenharmony_ci */
154514f5e3Sopenharmony_ci
164514f5e3Sopenharmony_ci#ifndef ECMASCRIPT_COMPILER_RT_CALL_SIGNATURE_H
174514f5e3Sopenharmony_ci#define ECMASCRIPT_COMPILER_RT_CALL_SIGNATURE_H
184514f5e3Sopenharmony_ci
194514f5e3Sopenharmony_ci#include "ecmascript/compiler/call_signature.h"
204514f5e3Sopenharmony_ci#include "ecmascript/stubs/runtime_stub_list.h"
214514f5e3Sopenharmony_ci
224514f5e3Sopenharmony_cinamespace panda::ecmascript::kungfu {
234514f5e3Sopenharmony_ciclass RuntimeStubCSigns {
244514f5e3Sopenharmony_cipublic:
254514f5e3Sopenharmony_ci    enum ID {
264514f5e3Sopenharmony_ci#define DEF_RUNTIME_STUB_ID(name) ID_##name,
274514f5e3Sopenharmony_ci        RUNTIME_STUB_LIST(DEF_RUNTIME_STUB_ID)
284514f5e3Sopenharmony_ci#undef DEF_RUNTIME_STUB_ID
294514f5e3Sopenharmony_ci        NUM_OF_STUBS
304514f5e3Sopenharmony_ci    };
314514f5e3Sopenharmony_ci
324514f5e3Sopenharmony_ci    enum NoGCStubID {
334514f5e3Sopenharmony_ci#define DEF_RUNTIME_STUB_ID(name) NOGCSTUB_ID_##name,
344514f5e3Sopenharmony_ci        RUNTIME_ASM_STUB_LIST(DEF_RUNTIME_STUB_ID)
354514f5e3Sopenharmony_ci        RUNTIME_STUB_WITHOUT_GC_LIST(DEF_RUNTIME_STUB_ID)
364514f5e3Sopenharmony_ci#undef DEF_RUNTIME_STUB_ID
374514f5e3Sopenharmony_ci        NUM_OF_RTSTUBS_WITHOUT_GC
384514f5e3Sopenharmony_ci    };
394514f5e3Sopenharmony_ci
404514f5e3Sopenharmony_ci    enum AsmStubID {
414514f5e3Sopenharmony_ci#define DEF_RUNTIME_STUB_ID(name) ASM_STUB_ID_##name,
424514f5e3Sopenharmony_ci        RUNTIME_ASM_STUB_LIST(DEF_RUNTIME_STUB_ID)
434514f5e3Sopenharmony_ci#undef DEF_RUNTIME_STUB_ID
444514f5e3Sopenharmony_ci        NUM_OF_ASM_STUBS
454514f5e3Sopenharmony_ci    };
464514f5e3Sopenharmony_ci
474514f5e3Sopenharmony_ci    static void Initialize();
484514f5e3Sopenharmony_ci
494514f5e3Sopenharmony_ci    static bool IsAsmStub(uint32_t index)
504514f5e3Sopenharmony_ci    {
514514f5e3Sopenharmony_ci        return index < AsmStubID::NUM_OF_ASM_STUBS;
524514f5e3Sopenharmony_ci    }
534514f5e3Sopenharmony_ci
544514f5e3Sopenharmony_ci    static void GetASMCSigns(std::vector<const CallSignature*>& callSigns);
554514f5e3Sopenharmony_ci
564514f5e3Sopenharmony_ci    static const CallSignature *Get(size_t index)
574514f5e3Sopenharmony_ci    {
584514f5e3Sopenharmony_ci        ASSERT(index < NUM_OF_RTSTUBS_WITHOUT_GC);
594514f5e3Sopenharmony_ci        return &callSigns_[index];
604514f5e3Sopenharmony_ci    }
614514f5e3Sopenharmony_ci
624514f5e3Sopenharmony_ci    static std::string GetRTName(int index)
634514f5e3Sopenharmony_ci    {
644514f5e3Sopenharmony_ci        ASSERT(index < NUM_OF_STUBS);
654514f5e3Sopenharmony_ci        switch (index) {
664514f5e3Sopenharmony_ci#define DEF_STUB_NAME(name) case ID_##name: { return std::string("RTStub_") + #name; }
674514f5e3Sopenharmony_ciRUNTIME_STUB_LIST(DEF_STUB_NAME)
684514f5e3Sopenharmony_ci#undef DEF_STUB_NAME
694514f5e3Sopenharmony_ci            default:
704514f5e3Sopenharmony_ci                return "unknown";
714514f5e3Sopenharmony_ci        }
724514f5e3Sopenharmony_ci        return "unknown";
734514f5e3Sopenharmony_ci    }
744514f5e3Sopenharmony_ci
754514f5e3Sopenharmony_ci    static bool IsCold(int index)
764514f5e3Sopenharmony_ci    {
774514f5e3Sopenharmony_ci        ASSERT(index < NUM_OF_STUBS);
784514f5e3Sopenharmony_ci        switch (index) {
794514f5e3Sopenharmony_ci            case ID_CheckSafePoint:
804514f5e3Sopenharmony_ci                return true;
814514f5e3Sopenharmony_ci            default:
824514f5e3Sopenharmony_ci                return false;
834514f5e3Sopenharmony_ci        }
844514f5e3Sopenharmony_ci        return false;
854514f5e3Sopenharmony_ci    }
864514f5e3Sopenharmony_ci
874514f5e3Sopenharmony_ci    static const CallSignature* GetOptimizedCallSign()
884514f5e3Sopenharmony_ci    {
894514f5e3Sopenharmony_ci        return &optimizedCallSign_;
904514f5e3Sopenharmony_ci    }
914514f5e3Sopenharmony_ci
924514f5e3Sopenharmony_ci    static const CallSignature* GetOptimizedFastCallSign()
934514f5e3Sopenharmony_ci    {
944514f5e3Sopenharmony_ci        return &optimizedFastCallSign_;
954514f5e3Sopenharmony_ci    }
964514f5e3Sopenharmony_ci
974514f5e3Sopenharmony_ciprivate:
984514f5e3Sopenharmony_ci    static CallSignature callSigns_[NUM_OF_RTSTUBS_WITHOUT_GC];
994514f5e3Sopenharmony_ci    static CallSignature optimizedCallSign_;
1004514f5e3Sopenharmony_ci    static CallSignature optimizedFastCallSign_;
1014514f5e3Sopenharmony_ci};
1024514f5e3Sopenharmony_cistatic_assert(static_cast<int>(kungfu::RuntimeStubCSigns::ID_CallRuntime) ==
1034514f5e3Sopenharmony_ci              static_cast<int>(kungfu::RuntimeStubCSigns::ASM_STUB_ID_CallRuntime));
1044514f5e3Sopenharmony_cistatic_assert(static_cast<int>(kungfu::RuntimeStubCSigns::ID_AsmInterpreterEntry) ==
1054514f5e3Sopenharmony_ci              static_cast<int>(kungfu::RuntimeStubCSigns::ASM_STUB_ID_AsmInterpreterEntry));
1064514f5e3Sopenharmony_ci#define RTSTUB_ID(name) kungfu::RuntimeStubCSigns::ID_##name
1074514f5e3Sopenharmony_ci} // namespace panda::ecmascript::kungfu
1084514f5e3Sopenharmony_ci#endif  // ECMASCRIPT_COMPILER_RT_CALL_SIGNATURE_H