1 /* 2 * Copyright (c) 2023 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 16 #ifndef NAMEMANGLER_H 17 #define NAMEMANGLER_H 18 #include <string> 19 #include <vector> 20 21 // This is a general name mangler which is shared between maple compiler and runtime. 22 // maple-compiler-specific data structure may NOT be used here. 23 namespace namemangler { 24 #define TO_STR(s) TO_STR2(s) 25 #define TO_STR2(s) #s 26 27 #define VTAB_PREFIX __vtb_ 28 #define ITAB_PREFIX __itb_ 29 #define VTAB_AND_ITAB_PREFIX __vtb_and_itb_ 30 #define ITAB_CONFLICT_PREFIX __itbC_ 31 #define CLASSINFO_PREFIX __cinf_ 32 #define CLASSINFO_RO_PREFIX __classinforo__ 33 #define SUPERCLASSINFO_PREFIX __superclasses__ 34 #define PRIMITIVECLASSINFO_PREFIX __pinf_ 35 #define CLASS_INIT_BRIDGE_PREFIX __ClassInitBridge__ 36 #define GCTIB_PREFIX MCC_GCTIB__ 37 #define REF_PREFIX REF_ 38 #define JARRAY_PREFIX A 39 40 #define VTAB_PREFIX_STR TO_STR(VTAB_PREFIX) 41 #define ITAB_PREFIX_STR TO_STR(ITAB_PREFIX) 42 #define VTAB_AND_ITAB_PREFIX_STR TO_STR(VTAB_AND_ITAB_PREFIX) 43 #define ITAB_CONFLICT_PREFIX_STR TO_STR(ITAB_CONFLICT_PREFIX) 44 #define CLASSINFO_PREFIX_STR TO_STR(CLASSINFO_PREFIX) 45 #define CLASSINFO_RO_PREFIX_STR TO_STR(CLASSINFO_RO_PREFIX) 46 #define SUPERCLASSINFO_PREFIX_STR TO_STR(SUPERCLASSINFO_PREFIX) 47 #define PRIMITIVECLASSINFO_PREFIX_STR TO_STR(PRIMITIVECLASSINFO_PREFIX) 48 #define CLASS_INIT_BRIDGE_PREFIX_STR TO_STR(CLASS_INIT_BRIDGE_PREFIX) 49 #define GCTIB_PREFIX_STR TO_STR(GCTIB_PREFIX) 50 #define REF_PREFIX_STR TO_STR(REF_PREFIX) 51 #define JARRAY_PREFIX_STR TO_STR(JARRAY_PREFIX) 52 53 // Names of all compiler-generated tables and accessed by runtime 54 static constexpr const char kMuidPrefixStr[] = "__muid_"; 55 static constexpr const char kMuidRoPrefixStr[] = "__muid_ro"; 56 static constexpr const char kMuidFuncDefTabPrefixStr[] = "__muid_func_def_tab"; 57 static constexpr const char kMuidFuncDefOrigTabPrefixStr[] = "__muid_ro_func_def_orig_tab"; 58 static constexpr const char kMuidFuncInfTabPrefixStr[] = "__muid_ro_func_inf_tab"; 59 static constexpr const char kMuidFuncMuidIdxTabPrefixStr[] = "__muid_ro_func_muid_idx_tab"; 60 static constexpr const char kMuidDataDefTabPrefixStr[] = "__muid_data_def_tab"; 61 static constexpr const char kMuidDataDefOrigTabPrefixStr[] = "__muid_ro_data_def_orig_tab"; 62 static constexpr const char kMuidFuncUndefTabPrefixStr[] = "__muid_func_undef_tab"; 63 static constexpr const char kMuidDataUndefTabPrefixStr[] = "__muid_data_undef_tab"; 64 static constexpr const char kMuidFuncDefMuidTabPrefixStr[] = "__muid_ro_func_def_muid_tab"; 65 static constexpr const char kMuidDataDefMuidTabPrefixStr[] = "__muid_ro_data_def_muid_tab"; 66 static constexpr const char kMuidFuncUndefMuidTabPrefixStr[] = "__muid_ro_func_undef_muid_tab"; 67 static constexpr const char kMuidDataUndefMuidTabPrefixStr[] = "__muid_ro_data_undef_muid_tab"; 68 static constexpr const char kMuidVtabAndItabPrefixStr[] = "__muid_vtab_and_itab"; 69 static constexpr const char kMuidItabConflictPrefixStr[] = "__muid_itab_conflict"; 70 static constexpr const char kMuidColdVtabAndItabPrefixStr[] = "__muid_cold_vtab_and_itab"; 71 static constexpr const char kMuidColdItabConflictPrefixStr[] = "__muid_cold_itab_conflict"; 72 static constexpr const char kMuidVtabOffsetPrefixStr[] = "__muid_vtab_offset_tab"; 73 static constexpr const char kMuidFieldOffsetPrefixStr[] = "__muid_field_offset_tab"; 74 static constexpr const char kMuidVtabOffsetKeyPrefixStr[] = "__muid_vtable_offset_key_tab"; 75 static constexpr const char kMuidFieldOffsetKeyPrefixStr[] = "__muid_field_offset_key_tab"; 76 static constexpr const char kMuidValueOffsetPrefixStr[] = "__muid_offset_value_table"; 77 static constexpr const char kMuidLocalClassInfoStr[] = "__muid_local_classinfo_tab"; 78 static constexpr const char kMuidSuperclassPrefixStr[] = "__muid_superclass"; 79 static constexpr const char kMuidGlobalRootlistPrefixStr[] = "__muid_globalrootlist"; 80 static constexpr const char kMuidClassMetadataPrefixStr[] = "__muid_classmetadata"; 81 static constexpr const char kMuidClassMetadataBucketPrefixStr[] = "__muid_classmetadata_bucket"; 82 static constexpr const char kMuidJavatextPrefixStr[] = "java_text"; 83 static constexpr const char kMuidDataSectionStr[] = "__data_section"; 84 static constexpr const char kMuidRangeTabPrefixStr[] = "__muid_range_tab"; 85 static constexpr const char kMuidConststrPrefixStr[] = "__muid_conststr"; 86 static constexpr const char kVtabOffsetTabStr[] = "__vtable_offset_table"; 87 static constexpr const char kFieldOffsetTabKeyStr[] = "__field_offset_key_table"; 88 static constexpr const char kFieldOffsetTabStr[] = "__field_offset_table"; 89 static constexpr const char kVtableKeyOffsetTabStr[] = "__vtable_offset_key_table"; 90 static constexpr const char kVtableOffsetTabKeyStr[] = "__vtable_offset_key_table"; 91 static constexpr const char kFieldKeyOffsetTabStr[] = "__field_offset_table"; 92 static constexpr const char kOffsetTabStr[] = "__offset_value_table"; 93 static constexpr const char kInlineCacheTabStr[] = "__inline_cache_table"; 94 static constexpr const char kLocalClassInfoStr[] = "__local_classinfo_table"; 95 static constexpr const char kMethodsInfoPrefixStr[] = "__methods_info__"; 96 static constexpr const char kMethodsInfoCompactPrefixStr[] = "__methods_infocompact__"; 97 static constexpr const char kFieldsInfoPrefixStr[] = "__fields_info__"; 98 static constexpr const char kFieldsInfoCompactPrefixStr[] = "__fields_infocompact__"; 99 static constexpr const char kFieldOffsetDataPrefixStr[] = "__fieldOffsetData__"; 100 static constexpr const char kMethodAddrDataPrefixStr[] = "__methodAddrData__"; 101 static constexpr const char kMethodSignaturePrefixStr[] = "__methodSignature__"; 102 static constexpr const char kParameterTypesPrefixStr[] = "__parameterTypes__"; 103 static constexpr const char kRegJNITabPrefixStr[] = "__reg_jni_tab"; 104 static constexpr const char kRegJNIFuncTabPrefixStr[] = "__reg_jni_func_tab"; 105 static constexpr const char kReflectionStrtabPrefixStr[] = "__reflection_strtab"; 106 static constexpr const char kReflectionStartHotStrtabPrefixStr[] = "__reflection_start_hot_strtab"; 107 static constexpr const char kReflectionBothHotStrTabPrefixStr[] = "__reflection_both_hot_strtab"; 108 static constexpr const char kReflectionRunHotStrtabPrefixStr[] = "__reflection_run_hot_strtab"; 109 static constexpr const char kReflectionNoEmitStrtabPrefixStr[] = "__reflection_no_emit_strtab"; 110 static constexpr const char kMarkMuidFuncDefStr[] = "muid_func_def:"; 111 static constexpr const char kMarkMuidFuncUndefStr[] = "muid_func_undef:"; 112 static constexpr const char kGcRootList[] = "gcRootNewList"; 113 static constexpr const char kDecoupleOption[] = "__decouple_option"; 114 static constexpr const char kDecoupleStr[] = "__decouple"; 115 static constexpr const char kCompilerVersionNum[] = "__compilerVersionNum"; 116 static constexpr const char kCompilerVersionNumStr[] = "__compilerVersionNumTab"; 117 static constexpr const char kCompilerMfileStatus[] = "__compiler_mfile_status"; 118 static constexpr const char kMapleGlobalVariable[] = "maple_global_variable"; 119 static constexpr const char kMapleLiteralString[] = "maple_literal_string"; 120 121 static constexpr const char kSourceMuid[] = "__sourceMuid"; 122 static constexpr const char kSourceMuidSectionStr[] = "__sourceMuidTab"; 123 static constexpr const char kDecoupleStaticKeyStr[] = "__staticDecoupleKeyOffset"; 124 static constexpr const char kDecoupleStaticValueStr[] = "__staticDecoupleValueOffset"; 125 static constexpr const char kMarkDecoupleStaticStr[] = "decouple_static:"; 126 static constexpr const char kClassInfoPrefix[] = "__cinf"; 127 static constexpr const char kBssSectionStr[] = "__bss_section"; 128 static constexpr const char kLinkerHashSoStr[] = "__linkerHashSo"; 129 130 static constexpr const char kStaticFieldNamePrefixStr[] = "__static_field_name"; 131 static constexpr const char kMplSuffix[] = ".mpl"; 132 static constexpr const char kClinvocation[] = ".clinvocation"; 133 static constexpr const char kPackageNameSplitterStr[] = "_2F"; 134 static constexpr const char kFileNameSplitterStr[] = "$$"; 135 static constexpr const char kNameSplitterStr[] = "_7C"; // 7C is the ascii code for | 136 static constexpr const char kRightBracketStr[] = "_29"; // 29 is the ascii code for ) 137 static constexpr const char kClassNameSplitterStr[] = "_3B_7C"; 138 static constexpr const char kJavaLangClassStr[] = "Ljava_2Flang_2FClass_3B"; 139 static constexpr const char kJavaLangObjectStr[] = "Ljava_2Flang_2FObject_3B"; 140 static constexpr const char kJavaLangClassloader[] = "Ljava_2Flang_2FClassLoader_3B"; 141 static constexpr const char kJavaLangObjectStrJVersion[] = "Ljava/lang/Object;"; 142 static constexpr const char kJavaLangStringStr[] = "Ljava_2Flang_2FString_3B"; 143 static constexpr const char kJavaLangExceptionStr[] = "Ljava_2Flang_2FException_3B"; 144 static constexpr const char kThrowClassStr[] = "Ljava_2Flang_2FThrowable_3B"; 145 static constexpr const char kReflectionClassesPrefixStr[] = "Ljava_2Flang_2Freflect_2F"; 146 static constexpr const char kReflectionClassMethodStr[] = "Ljava_2Flang_2Freflect_2FMethod_241_3B"; 147 static constexpr const char kClassMetadataTypeName[] = "__class_meta__"; 148 static constexpr const char kPtrPrefixStr[] = "_PTR"; 149 static constexpr const char kClassINfoPtrPrefixStr[] = "_PTR__cinf_"; 150 static constexpr const char kArrayClassInfoPrefixStr[] = "__cinf_A"; 151 static constexpr const char kShadowClassName[] = "shadow_24__klass__"; 152 static constexpr const char kClinitSuffix[] = "_7C_3Cclinit_3E_7C_28_29V"; 153 static constexpr const char kCinitStr[] = "_7C_3Cinit_3E_7C_28"; 154 static constexpr const char kClinitSubStr[] = "7C_3Cinit_3E_7C"; 155 156 static constexpr const char kPreNativeFunc[] = "MCC_PreNativeCall"; 157 static constexpr const char kPostNativeFunc[] = "MCC_PostNativeCall"; 158 static constexpr const char kDecodeRefFunc[] = "MCC_DecodeReference"; 159 static constexpr const char kFindNativeFunc[] = "MCC_FindNativeMethodPtr"; 160 static constexpr const char kFindNativeFuncNoeh[] = "MCC_FindNativeMethodPtrWithoutException"; 161 static constexpr const char kDummyNativeFunc[] = "MCC_DummyNativeMethodPtr"; 162 static constexpr const char kCheckThrowPendingExceptionFunc[] = "MCC_CheckThrowPendingException"; 163 static constexpr const char kCallFastNative[] = "MCC_CallFastNative"; 164 static constexpr const char kCallFastNativeExt[] = "MCC_CallFastNativeExt"; 165 static constexpr const char kCallSlowNativeExt[] = "MCC_CallSlowNativeExt"; 166 static constexpr const char kSetReliableUnwindContextFunc[] = "MCC_SetReliableUnwindContext"; 167 168 static constexpr const char kArrayClassCacheTable[] = "__arrayClassCacheTable"; 169 static constexpr const char kArrayClassCacheNameTable[] = "__muid_ro_arrayClassCacheNameTable"; 170 static constexpr const char kFunctionLayoutStr[] = "__func_layout__"; 171 172 static constexpr const char kFunctionProfileTabPrefixStr[] = "__muid_profile_func_tab"; 173 174 static constexpr const char kBBProfileTabPrefixStr[] = "__muid_prof_counter_tab"; 175 static constexpr const char kFuncIRProfInfTabPrefixStr[] = "__muid_prof_ir_desc_tab"; 176 177 static constexpr const char kprefixProfModDesc[] = "__mpl_prof_moddesc_"; 178 static constexpr const char kprefixProfCtrTbl[] = "__mpl_prof_ctrtbl_"; 179 static constexpr const char kprefixProfFuncDesc[] = "__mpl_prof_funcdesc_"; 180 static constexpr const char kprefixProfFuncDescTbl[] = "__mpl_func_prof_desc_tbl_"; 181 static constexpr const char kprefixProfInit[] = "__mpl_prof_init_"; 182 static constexpr const char kprefixProfExit[] = "__mpl_prof_exit_"; 183 static constexpr const char kGCCProfInit[] = "__gcov_init"; 184 static constexpr const char kGCCProfExit[] = "__gcov_exit"; 185 static constexpr const char kMplMergeFuncAdd[] = "__gcov_merge_add"; 186 static constexpr const char kProfFileNameExt[] = ".gcda"; 187 188 static constexpr const char kBindingProtectedRegionStr[] = "__BindingProtectRegion__"; 189 190 static constexpr const char kClassNamePrefixStr[] = "L"; 191 static constexpr const char kClassMethodSplitterStr[] = "_3B"; 192 static constexpr const char kFuncGetCurrentCl[] = "MCC_GetCurrentClassLoader"; 193 // Serve as a global flag to indicate whether frequent strings have been compressed 194 extern bool doCompression; 195 196 // Return the input string if the compression is not on; otherwise, return its compressed version 197 std::string GetInternalNameLiteral(std::string name); 198 std::string GetOriginalNameLiteral(std::string name); 199 200 std::string EncodeName(const std::string &name); 201 std::string DecodeName(const std::string &name); 202 void DecodeMapleNameToJavaDescriptor(const std::string &nameIn, std::string &nameOut); 203 204 std::string NativeJavaName(const std::string &name, bool overLoaded = true); 205 206 __attribute__((visibility("default"))) unsigned UTF16ToUTF8(std::string &str, const std::u16string &str16, 207 unsigned short num = 0, bool isBigEndian = false); 208 __attribute__((visibility("default"))) unsigned UTF8ToUTF16(std::u16string &str16, const std::string &str, 209 unsigned short num = 0, bool isBigEndian = false); 210 void GetUnsignedLeb128Encode(std::vector<uint8_t> &dest, uint32_t value); 211 uint32_t GetUnsignedLeb128Decode(const uint8_t **data); 212 uint64_t GetUleb128Encode(uint64_t val); 213 uint64_t GetSleb128Encode(int64_t val); 214 uint64_t GetUleb128Decode(uint64_t val); 215 int64_t GetSleb128Decode(uint64_t val); 216 size_t GetUleb128Size(uint64_t val); 217 size_t GetSleb128Size(int32_t val); 218 bool NeedConvertUTF16(const std::string &str8); 219 } // namespace namemangler 220 221 #endif 222