From 7da30af552a1e4d5c774b65b4ac816a66ed6668d Mon Sep 17 00:00:00 2001 From: Aaron Simkin Date: Fri, 26 Apr 2024 03:13:39 +0800 Subject: [PATCH 01/11] [ArkTS][Compiler] Implement getBytes() with IrToc Implement String.getBytes() method of the ArkTS standard library as an intrinsic using IrToc. Issue: #IARNTP https://gitee.com/openharmony/arkcompiler_runtime_core/issues/IARNTP Change-Id: I3658be192c0c8b2b6621b787223eb634785e152e Signed-off-by: Aaron Simkin --- .../compiler/optimizer/ir/runtime_interface.h | 10 ++++ .../compiler/optimizer/pass_manager.cpp | 1 - static_core/irtoc/scripts/string_helpers.irt | 40 +++++++++++++- .../lowering/llvm_ir_constructor.cpp | 11 ++-- .../ets/compiler/codegen_intrinsics_ets.cpp | 19 +++++++ .../plugins/ets/irtoc_scripts/string.irt | 52 +++++++++++++++++++ .../ets_llvm_ir_constructor_gen.inl | 15 ++++++ .../ets_llvm_ir_constructor_h_gen.inl | 1 + .../runtime/ets_class_linker_extension.cpp | 1 + .../plugins/ets/runtime/ets_coroutine.cpp | 1 + .../plugins/ets/runtime/ets_entrypoints.yaml | 31 +++++++++++ .../ets/runtime/ets_libbase_runtime.yaml | 26 +++++++--- .../runtime/intrinsics/std_core_String.cpp | 50 +++++++++++++++--- .../plugins/ets/stdlib/std/core/String.sts | 12 +---- .../ets_test_suite/intrinsics/CMakeLists.txt | 1 + .../intrinsics/string_endswith.sts | 1 - .../intrinsics/string_getbytes.sts | 52 +++++++++++++++++++ .../intrinsics/string_getchars.sts | 1 - .../intrinsics/string_hashcode.sts | 1 - .../intrinsics/string_startswith.sts | 1 - .../intrinsics/string_substring.sts | 1 - .../ets_test_suite/intrinsics/string_trim.sts | 1 - .../intrinsics/stringbuilder.sts | 1 - .../runtime/asm_defines/asm_defines.def | 1 + static_core/runtime/compiler.cpp | 8 +++ static_core/runtime/compiler.h | 1 + static_core/runtime/include/managed_thread.h | 9 ++++ static_core/runtime/include/thread.h | 1 + static_core/runtime/runtime.cpp | 1 + 29 files changed, 312 insertions(+), 39 deletions(-) create mode 100644 static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_getbytes.sts diff --git a/static_core/compiler/optimizer/ir/runtime_interface.h b/static_core/compiler/optimizer/ir/runtime_interface.h index ee443ae43..2b7c3dcb8 100644 --- a/static_core/compiler/optimizer/ir/runtime_interface.h +++ b/static_core/compiler/optimizer/ir/runtime_interface.h @@ -676,6 +676,11 @@ public: } /// Array information + uintptr_t GetArrayU8ClassPointerTlsOffset(Arch arch) const + { + return cross_values::GetManagedThreadArrayU8ClassPtrOffset(arch); + } + uintptr_t GetArrayU16ClassPointerTlsOffset(Arch arch) const { return cross_values::GetManagedThreadArrayU16ClassPtrOffset(arch); @@ -706,6 +711,11 @@ public: return 0; } + virtual ClassPtr GetArrayU8Class([[maybe_unused]] MethodPtr method) const + { + return nullptr; + } + virtual ClassPtr GetArrayU16Class([[maybe_unused]] MethodPtr method) const { return nullptr; diff --git a/static_core/compiler/optimizer/pass_manager.cpp b/static_core/compiler/optimizer/pass_manager.cpp index 169332bf3..7dab832d3 100644 --- a/static_core/compiler/optimizer/pass_manager.cpp +++ b/static_core/compiler/optimizer/pass_manager.cpp @@ -111,7 +111,6 @@ void PassManager::DumpGraph([[maybe_unused]] const char *passName) } ASSERT(strm.is_open()); GetGraph()->Dump(&strm); - LOG(DEBUG, COMPILER) << "Dump IR to " << fileName; #endif // ENABLE_IR_DUMP } void PassManager::DumpLifeIntervals([[maybe_unused]] const char *passName) diff --git a/static_core/irtoc/scripts/string_helpers.irt b/static_core/irtoc/scripts/string_helpers.irt index 0f5bae706..c29f1a6f9 100644 --- a/static_core/irtoc/scripts/string_helpers.irt +++ b/static_core/irtoc/scripts/string_helpers.irt @@ -190,7 +190,6 @@ def GenerateStringEquals(lang, dynamic, compression) } end - # Try to allocate String in TLAB. # The result is either a pointer to a new string or null if there is no enough space in TLAB. macro(:allocate_string_tlab) do |string_klass, data_size| @@ -225,6 +224,44 @@ macro(:allocate_string_tlab) do |string_klass, data_size| _allocated_string := _start end +# Try to allocate Array of i8 chars in TLAB. +# The result is either a pointer to a new array or null if there is no enough space in TLAB. +macro(:allocate_array_of_bytes_tlab) do |array_klass, char_count| + if Options.arch == :arm32 + Intrinsic(:UNREACHABLE).Terminator.void + ReturnVoid().void + next + end + + elements_num := And(char_count, "0x00000000ffffffff").word + # Account for u16 char size + _size := Cast(elements_num).word + # Add sizeof(Array) and do align + _size := AndI(AddI(_size).Imm(Constants::ARRAY_CLASS_SIZE_WITH_ALIGNMENT).word).Imm(Constants::ALIGNMENT_MASK).word + # Load pointer to the TLAB from TLS + _tlab := LoadI(%tr).Imm(Constants::TLAB_OFFSET).ptr + # Load pointer to the start address of free memory in the TLAB + _start := LoadI(_tlab).Imm(Constants::TLAB_CUR_FREE_POSITION_OFFSET).ptr + # Load pointer to the end address of free memory in the TLAB + _end := LoadI(_tlab).Imm(Constants::TLAB_MEMORY_END_ADDR_OFFSET).ptr + # Check if there is enough space + If(Sub(_end, _start).word, _size).B.Unlikely.b { + Goto(:SlowPathEntrypoint) + } + Intrinsic(:WRITE_TLAB_STATS_SAFE, _start, _size, Cast(-1).u64).void if defines.DEBUG + if defines.__SANITIZE_ADDRESS__ || defines.__SANITIZE_THREAD__ + call_runtime_save_all(Constants::ANNOTATE_SANITIZERS_NO_BRIDGE, _start, _size).void + end + # Store class of the object + StoreI(_start, array_klass).Imm(Constants::OBJECT_CLASS_OFFSET).ref + # Store array length + StoreI(_start, elements_num).Imm(Constants::ARRAY_LENGTH_OFFSET).word + # Update the TLAB state + StoreI(Add(_tlab, Constants::TLAB_CUR_FREE_POSITION_OFFSET).ptr, Add(_start, _size).ptr).Imm(0).Volatile.ptr + # Return a pointer to the newly allocated array + _allocated_array := _start +end + # Try to allocate Array of u16 chars in TLAB. # The result is either a pointer to a new array or null if there is no enough space in TLAB. macro(:allocate_array_of_chars_tlab) do |array_klass, char_count| @@ -432,6 +469,7 @@ else # if Options.arch == :arm64 Label(:CopyLoop_8b) i := Phi(i1, i2).u64 chunk := Load(src_data, ShlI(i).Imm(3).u64).u64 + chunk := AndI(chunk).Imm(0x00ff00ff00ff00ff).u64 # zero high part of each two-byte chunk := AndI(Or(chunk, ShrI(chunk).Imm(8).u64).u64).Imm(0x0000ffff0000ffff).u64 chunk := Or(chunk, ShrI(chunk).Imm(16).u64).u64 Store(dst_data, ShlI(i).Imm(2).u64, Cast(chunk).u32).u32 diff --git a/static_core/libllvmbackend/lowering/llvm_ir_constructor.cpp b/static_core/libllvmbackend/lowering/llvm_ir_constructor.cpp index 80071cfdd..4c976f6c0 100644 --- a/static_core/libllvmbackend/lowering/llvm_ir_constructor.cpp +++ b/static_core/libllvmbackend/lowering/llvm_ir_constructor.cpp @@ -2319,15 +2319,14 @@ void LLVMIrConstructor::CreateCompressUtf16ToUtf8CharsUsingSimd(Inst *inst) ASSERT(inst->GetInputType(0) == DataType::POINTER); ASSERT(inst->GetInputType(1) == DataType::POINTER); static_assert(VECTOR_SIZE == VECTOR_SIZE_8 || VECTOR_SIZE == VECTOR_SIZE_16, "Unexpected vector size"); - auto intrinsicId = llvm::Intrinsic::AARCH64Intrinsics::aarch64_neon_ld2; - auto vecTy = llvm::VectorType::get(builder_.getInt8Ty(), VECTOR_SIZE, false); + auto vecInTy = llvm::VectorType::get(builder_.getInt16Ty(), VECTOR_SIZE, false); + auto vecOutTy = llvm::VectorType::get(builder_.getInt8Ty(), VECTOR_SIZE, false); auto u16Ptr = GetInputValue(inst, 0); // ptr to src array of utf16 chars auto u8Ptr = GetInputValue(inst, 1); // ptr to dst array of utf8 chars - auto ld2 = llvm::Intrinsic::getDeclaration(func_->getParent(), intrinsicId, {vecTy, u16Ptr->getType()}); - auto vld2 = builder_.CreateCall(ld2, {u16Ptr}); - auto u8Vec = builder_.CreateExtractValue(vld2, {0}); - builder_.CreateStore(u8Vec, u8Ptr); + auto inVec = builder_.CreateLoad(vecInTy, u16Ptr); + auto outVec = builder_.CreateTrunc(inVec, vecOutTy); + builder_.CreateStore(outVec, u8Ptr); } // Getters diff --git a/static_core/plugins/ets/compiler/codegen_intrinsics_ets.cpp b/static_core/plugins/ets/compiler/codegen_intrinsics_ets.cpp index 6f84c194a..9aa14222f 100644 --- a/static_core/plugins/ets/compiler/codegen_intrinsics_ets.cpp +++ b/static_core/plugins/ets/compiler/codegen_intrinsics_ets.cpp @@ -471,4 +471,23 @@ void Codegen::CreateStringEndsWith(IntrinsicInst *inst, Reg dst, SRCREGS src) auto idx = src[THIRD_OPERAND]; CallFastPath(inst, RuntimeInterface::EntrypointId::STRING_ENDS_WITH, dst, {}, str, sfx, idx); } + +void Codegen::CreateStringGetBytesTlab([[maybe_unused]] IntrinsicInst *inst, Reg dst, SRCREGS src) +{ + ASSERT(IsCompressedStringsEnabled()); + auto entrypointId = EntrypointId::STRING_GET_BYTES_TLAB; + auto runtime = GetGraph()->GetRuntime(); + if (GetGraph()->IsAotMode()) { + ScopedTmpReg klassReg(GetEncoder()); + GetEncoder()->EncodeLdr(klassReg, false, + MemRef(ThreadReg(), runtime->GetArrayU8ClassPointerTlsOffset(GetArch()))); + CallFastPath(inst, entrypointId, dst, {}, src[FIRST_OPERAND], src[SECOND_OPERAND], src[THIRD_OPERAND], + klassReg); + } else { + auto klassImm = TypedImm(reinterpret_cast(runtime->GetArrayU8Class(GetGraph()->GetMethod()))); + CallFastPath(inst, entrypointId, dst, {}, src[FIRST_OPERAND], src[SECOND_OPERAND], src[THIRD_OPERAND], + klassImm); + } +} + } // namespace ark::compiler diff --git a/static_core/plugins/ets/irtoc_scripts/string.irt b/static_core/plugins/ets/irtoc_scripts/string.irt index 0ede9ed41..e7d878a00 100644 --- a/static_core/plugins/ets/irtoc_scripts/string.irt +++ b/static_core/plugins/ets/irtoc_scripts/string.irt @@ -770,3 +770,55 @@ function(:StringEndsWith, entrypoint = get_entrypoint_offset("STRING_ENDS_WITH_BASE") Intrinsic(:TAIL_CALL).AddImm(entrypoint).MethodAsImm("StringEndsWithBase").Terminator.b } +function(:StringGetBytesTlab, + params: {str: 'ref', begin_index: 'i32', end_index: 'i32', array_klass: 'ref'}, + regmap: $full_regmap, + regalloc_set: $panda_mask, + mode: [:FastPath]) { + + if Options.arch == :arm32 + Intrinsic(:UNREACHABLE).Terminator.void + ReturnVoid().void + next + end + + If(begin_index, end_index).GT.Unlikely.b { + Goto(:SlowPathEntrypoint) # Out of range + } + + If(begin_index, Cast(0).i32).LT.Unlikely.b { + Goto(:SlowPathEntrypoint) # Out of range + } + + # Note, 'str' is checked against nullptr in the InstBuilder (see AddArgNullcheckIfNeeded) + length := LoadI(str).Imm(Constants::STRING_LENGTH_OFFSET).u32; + uncompressed := AndI(length).Imm(1).u32; + length := ShrI(length).Imm(1).u32; + + If(Cast(end_index).u32, length).A.Unlikely.b { + Goto(:SlowPathEntrypoint) # Out of range + } + offset := Shl(begin_index, uncompressed).u32 + + src_str_data := Add(Cast(str).SrcType(Constants::COMPILER_REFERENCE).ptr, Cast(Constants::STRING_DATA_OFFSET).u64).ptr + src_str_data := Add(src_str_data, Cast(offset).u64).ptr + +# Allocate a new array of u8 (bytes) + count := Sub(Cast(end_index).u32, Cast(begin_index).u32).u64 + new_arr := allocate_array_of_bytes_tlab(array_klass, Cast(count).word) + new_arr_data := Add(new_arr, Cast(Constants::ARRAY_DATA_OFFSET).u64).ptr + If(uncompressed, Cast(0).u32).EQ.Likely.b { + copy_u8_chars(src_str_data, new_arr_data, count) + Goto(:End) + } + compress_u16_to_u8_chars(src_str_data, new_arr_data, count) + + Label(:End) + Return(new_arr).ptr + + Label(:SlowPathEntrypoint) + entrypoint = get_entrypoint_offset("STRING_GET_BYTES_SLOW_PATH") + Intrinsic(:SLOW_PATH_ENTRY, str, begin_index, end_index).AddImm(entrypoint).MethodAsImm("StringGetBytes4ArgBridge").Terminator.ptr + Intrinsic(:UNREACHABLE).Terminator.void if defines.DEBUG +} + diff --git a/static_core/plugins/ets/libllvmbackend/ets_llvm_ir_constructor_gen.inl b/static_core/plugins/ets/libllvmbackend/ets_llvm_ir_constructor_gen.inl index 1fd01fb6c..009d72857 100644 --- a/static_core/plugins/ets/libllvmbackend/ets_llvm_ir_constructor_gen.inl +++ b/static_core/plugins/ets/libllvmbackend/ets_llvm_ir_constructor_gen.inl @@ -352,3 +352,18 @@ bool LLVMIrConstructor::EmitStringEndsWith(Inst *inst) { return EmitFastPath(inst, RuntimeInterface::EntrypointId::STRING_ENDS_WITH, 3U); } + +bool LLVMIrConstructor::EmitStringGetBytesTlab(Inst *inst) +{ + auto offset = GetGraph()->GetRuntime()->GetArrayU8ClassPointerTlsOffset(GetGraph()->GetArch()); + auto klass = llvmbackend::runtime_calls::LoadTLSValue(&builder_, arkInterface_, offset, builder_.getPtrTy()); + auto eid = RuntimeInterface::EntrypointId::STRING_GET_BYTES_TLAB; + auto result = CreateEntrypointCall(eid, inst, + {GetInputValue(inst, 0), GetInputValue(inst, 1), GetInputValue(inst, 2), klass}); + ASSERT(result->getCallingConv() == llvm::CallingConv::C); + result->setCallingConv(llvm::CallingConv::ArkFast4); + result->addRetAttr(llvm::Attribute::NonNull); + result->addRetAttr(llvm::Attribute::NoAlias); + ValueMapAdd(inst, result); + return true; +} diff --git a/static_core/plugins/ets/libllvmbackend/ets_llvm_ir_constructor_h_gen.inl b/static_core/plugins/ets/libllvmbackend/ets_llvm_ir_constructor_h_gen.inl index 2fad92e65..cead7dc9a 100644 --- a/static_core/plugins/ets/libllvmbackend/ets_llvm_ir_constructor_h_gen.inl +++ b/static_core/plugins/ets/libllvmbackend/ets_llvm_ir_constructor_h_gen.inl @@ -39,3 +39,4 @@ bool EmitStringTrimRight(Inst *inst); bool EmitCharIsWhiteSpace(Inst *inst); bool EmitStringStartsWith(Inst *inst); bool EmitStringEndsWith(Inst *inst); +bool EmitStringGetBytesTlab(Inst *inst); diff --git a/static_core/plugins/ets/runtime/ets_class_linker_extension.cpp b/static_core/plugins/ets/runtime/ets_class_linker_extension.cpp index 4c141dbc0..c50ffe4d4 100644 --- a/static_core/plugins/ets/runtime/ets_class_linker_extension.cpp +++ b/static_core/plugins/ets/runtime/ets_class_linker_extension.cpp @@ -572,6 +572,7 @@ void EtsClassLinkerExtension::InitializeBuiltinClasses() // initialization in MT ManagedThread ctor and EtsCoroutine::Initialize coro->SetStringClassPtr(GetClassRoot(ClassRoot::STRING)); coro->SetArrayU16ClassPtr(GetClassRoot(ClassRoot::ARRAY_U16)); + coro->SetArrayU8ClassPtr(GetClassRoot(ClassRoot::ARRAY_U8)); } } // namespace ark::ets diff --git a/static_core/plugins/ets/runtime/ets_coroutine.cpp b/static_core/plugins/ets/runtime/ets_coroutine.cpp index b784c9a63..f929184e1 100644 --- a/static_core/plugins/ets/runtime/ets_coroutine.cpp +++ b/static_core/plugins/ets/runtime/ets_coroutine.cpp @@ -59,6 +59,7 @@ void EtsCoroutine::Initialize() auto *linkExt = GetPandaVM()->GetClassLinker()->GetEtsClassLinkerExtension(); SetStringClassPtr(linkExt->GetClassRoot(ClassRoot::STRING)); SetArrayU16ClassPtr(linkExt->GetClassRoot(ClassRoot::ARRAY_U16)); + SetArrayU8ClassPtr(linkExt->GetClassRoot(ClassRoot::ARRAY_U8)); } ASSERT(promiseClassPtr_ != nullptr || !HasManagedEntrypoint()); diff --git a/static_core/plugins/ets/runtime/ets_entrypoints.yaml b/static_core/plugins/ets/runtime/ets_entrypoints.yaml index 13d5eab8a..26dce0858 100644 --- a/static_core/plugins/ets/runtime/ets_entrypoints.yaml +++ b/static_core/plugins/ets/runtime/ets_entrypoints.yaml @@ -618,3 +618,34 @@ - ark::ObjectHeader* # string to check - ark::ObjectHeader* # suffix to check - int32_t # index of char to stop at + +- name: StringGetBytesTlab + entrypoint: StringGetBytesTlab + bridge: none + properties: [irtoc] + signature: + - ark::coretypes::Array* # resulting array of uint8 + - ark::ObjectHeader* # src string + - int32_t # begin index + - int32_t # end index + - ark::Class* # Array u16 class pointer + +- name: StringGetBytes4Arg + entrypoint: StdCoreStringGetBytes + bridge: odd_saved4 + properties: [intrinsic] + signature: + - ark::coretypes::Array* # resulting array of utf16 chars + - ark::ObjectHeader* # src string + - int32_t # begin index + - int32_t # end index + +- name: StringGetBytesSlowPath + entrypoint: StdCoreStringGetBytes + bridge: slow_path + properties: [intrinsic] + signature: + - ark::coretypes::Array* # resulting array of int8 + - ark::ObjectHeader* # src string + - int32_t # begin index + - int32_t # end index diff --git a/static_core/plugins/ets/runtime/ets_libbase_runtime.yaml b/static_core/plugins/ets/runtime/ets_libbase_runtime.yaml index afaf3b045..904d40262 100644 --- a/static_core/plugins/ets/runtime/ets_libbase_runtime.yaml +++ b/static_core/plugins/ets/runtime/ets_libbase_runtime.yaml @@ -380,7 +380,6 @@ intrinsics: impl: ark::ets::intrinsics::StdMathTan safe_intrinsic: true - - name: StdMathTanh space: ets class_name: std.math.ETSGLOBAL @@ -658,7 +657,7 @@ intrinsics: method_name: getChars static: false signature: - ret: u16\\[ + ret: u16[] args: - i32 - i32 @@ -670,6 +669,24 @@ intrinsics: clear_flags: [ ] set_flags: [ ] + - name: StdCoreStringGetBytes + space: ets + class_name: std.core.String + method_name: getBytes + static: false + signature: + ret: i8[] + args: + - i32 + - i32 + impl: ark::ets::intrinsics::StdCoreStringGetBytes + codegen_func: CreateStringGetBytesTlab + codegen_arch: [arm64, amd64] + llvm_codegen_func: EmitStringGetBytesTlab + need_param_locations: true + clear_flags: [ ] + set_flags: [ ] + - name: StdCoreStringGetLength space: ets class_name: std.core.String @@ -1902,7 +1919,6 @@ intrinsics: impl: ark::ets::intrinsics::StdCoreStackTraceProvisionStackTrace clear_flags: [ no_dce ] - - name: StdCoreExit space: ets class_name: std.core.ETSGLOBAL @@ -3589,7 +3605,6 @@ intrinsics: codegen_func: CreateCharIsWhiteSpace llvm_codegen_func: EmitCharIsWhiteSpace - ################### # std.core.Value # ################### @@ -3954,8 +3969,6 @@ intrinsics: args: [ std.core.Object, std.core.String, f64 ] impl: ark::ets::intrinsics::ValueAPISetFieldByNameDouble - - - name: ValueAPIGetArrayLength space: ets class_name: std.core.ETSGLOBAL @@ -4056,7 +4069,6 @@ intrinsics: args: [ std.core.Object, i64, f64 ] impl: ark::ets::intrinsics::ValueAPISetElementDouble - - name: ValueAPIGetElementObject space: ets class_name: std.core.ETSGLOBAL diff --git a/static_core/plugins/ets/runtime/intrinsics/std_core_String.cpp b/static_core/plugins/ets/runtime/intrinsics/std_core_String.cpp index b38f09a62..d24fc3be4 100644 --- a/static_core/plugins/ets/runtime/intrinsics/std_core_String.cpp +++ b/static_core/plugins/ets/runtime/intrinsics/std_core_String.cpp @@ -42,7 +42,7 @@ constexpr const uint32_t CHAR0X1FFC00 = 0x1ffc00; constexpr const uint16_t CHAR0XD800 = 0xd800; constexpr const uint16_t CHAR0XDC00 = 0xdc00; -EtsCharArray *StdCoreStringGetChars(EtsString *s, ets_int begin, ets_int end) +static ObjectHeader *StdCoreStringGetDataAsArray(EtsString *s, ets_int begin, ets_int end, bool isUtf16) { ASSERT(s != nullptr); ets_int length = s->GetLength(); @@ -63,13 +63,49 @@ EtsCharArray *StdCoreStringGetChars(EtsString *s, ets_int begin, ets_int end) [[maybe_unused]] HandleScope scope(thread); VMHandle sHandle(thread, s->GetCoreType()); ets_int n = end - begin; - EtsCharArray *charArray = EtsCharArray::Create(n); - if (charArray == nullptr || n == 0) { - return charArray; + void *array = nullptr; + if (isUtf16) { + array = EtsCharArray::Create(n); + } else { + array = EtsByteArray::Create(n); + } + if (array == nullptr || n == 0) { + return reinterpret_cast(array); + } + if (isUtf16) { + auto charArray = reinterpret_cast(array); + Span out(charArray->GetData(), charArray->GetLength()); + sHandle.GetPtr()->CopyDataRegionUtf16(&out[0], begin, charArray->GetLength(), sHandle.GetPtr()->GetLength()); + } else { + auto byteArray = reinterpret_cast(array); + Span out(byteArray->GetData(), byteArray->GetLength()); + + /* as we need only one LSB no sophisticated conversion is needed */ + if (sHandle.GetPtr()->IsUtf16()) { + auto in = sHandle.GetPtr()->GetDataUtf16(); + for (int i = 0; i < n; ++i) { + // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic) + out[i] = in[i + begin]; + } + } else { + auto in = sHandle.GetPtr()->GetDataMUtf8(); + for (int i = 0; i < n; ++i) { + // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic) + out[i] = in[i + begin]; + } + } } - Span out(charArray->GetData(), charArray->GetLength()); - sHandle.GetPtr()->CopyDataRegionUtf16(&out[0], begin, charArray->GetLength(), sHandle.GetPtr()->GetLength()); - return charArray; + return reinterpret_cast(array); +} + +ObjectHeader *StdCoreStringGetChars(EtsString *s, ets_int begin, ets_int end) +{ + return StdCoreStringGetDataAsArray(s, begin, end, true); +} + +ObjectHeader *StdCoreStringGetBytes(EtsString *s, ets_int begin, ets_int end) +{ + return StdCoreStringGetDataAsArray(s, begin, end, false); } EtsString *StdCoreStringSubstring(EtsString *str, ets_int begin, ets_int end) diff --git a/static_core/plugins/ets/stdlib/std/core/String.sts b/static_core/plugins/ets/stdlib/std/core/String.sts index fc925baad..c227b46f4 100644 --- a/static_core/plugins/ets/stdlib/std/core/String.sts +++ b/static_core/plugins/ets/stdlib/std/core/String.sts @@ -318,17 +318,9 @@ export final class String extends Object implements Comparable, JSONable * @throws StringIndexOutOfBoundsError if end >= length * @throws AssertionError if begin > end * - * @returns char[] array + * @returns byte[] array */ - public getBytes(begin: int, end: int): byte[] { - assert begin <= end: "Begin idx must be less then end idx"; - let resChars: char[] = this.getChars(begin, end); - let resBytes: byte[] = new byte[resChars.length]; - for (let i: int = 0; i < resChars.length; i++) { - resBytes[i] = resChars[i] as byte; - } - return resBytes; - } + public native getBytes(begin: int, end: int): byte[]; /** * Compares the given StringBuilder to this String. The diff --git a/static_core/plugins/ets/tests/ets_test_suite/intrinsics/CMakeLists.txt b/static_core/plugins/ets/tests/ets_test_suite/intrinsics/CMakeLists.txt index 389cffed9..e00fb4b57 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/intrinsics/CMakeLists.txt +++ b/static_core/plugins/ets/tests/ets_test_suite/intrinsics/CMakeLists.txt @@ -23,6 +23,7 @@ set(intrinsics_tests string_from_chars string_substring string_getchars + string_getbytes string_hashcode string_concat string_trim diff --git a/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_endswith.sts b/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_endswith.sts index a76e238fa..4daedff49 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_endswith.sts +++ b/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_endswith.sts @@ -97,6 +97,5 @@ function main(): int { assert Nature.endsWith('自然界', 2) == false; assert Nature.endsWith('自然界', 100) == true; - console.println("PASS"); return 0; } diff --git a/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_getbytes.sts b/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_getbytes.sts new file mode 100644 index 000000000..34258966b --- /dev/null +++ b/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_getbytes.sts @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +let str: String = new String("abcΣΨΩ0123456789!"); +let bytes: byte[] = [97, 98, 99, -93, -88, -87, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 33] + +function equals(val: byte[], exp: byte[], offset: int): boolean +{ + if (val.length != (exp.length - offset)) + return false; + for (let i: int = 0; i < val.length; ++i) { + if (val[i] != exp[i + offset]) + return false; + } + return true; +} + +function printArray(a: byte[], offset: int, name: String): void +{ + console.println(name + " length: " + (a.length - offset)) + console.print(name + " data: [ ") + for (let i: int = 0; i < a.length; ++i) { + console.print(a[i + offset] + " "); + } + console.println("]"); +} + +function main(): int { + let len: int = str.getLength() + for (let i: int = 0; i < len; ++i) { + let arr: byte[] = str.getBytes(i, len); + if (!equals(arr, bytes, i)) { + console.println("at: " + i); + printArray(arr, 0, "actual ") + printArray(bytes, i, "expected") + return 1; + } + } + return 0; +} diff --git a/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_getchars.sts b/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_getchars.sts index 1ef58a708..ab78e5d5f 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_getchars.sts +++ b/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_getchars.sts @@ -114,6 +114,5 @@ function main(): int { console.println("FAIL"); return 1; } - console.println("PASS"); return 0; } diff --git a/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_hashcode.sts b/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_hashcode.sts index 3190d5751..56f9cf8a9 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_hashcode.sts +++ b/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_hashcode.sts @@ -160,6 +160,5 @@ function main(): int { return 6; } - console.println("PASS"); return 0; } diff --git a/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_startswith.sts b/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_startswith.sts index ca71245d3..7c2235624 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_startswith.sts +++ b/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_startswith.sts @@ -60,6 +60,5 @@ function main(): int { assert Nature.startsWith("界", 2) == true assert Nature.startsWith("界", 3) == false - console.println("PASS"); return 0; } diff --git a/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_substring.sts b/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_substring.sts index c48199d4b..26aa97a18 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_substring.sts +++ b/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_substring.sts @@ -115,6 +115,5 @@ function main(): int { console.println("FAIL"); return 1; } - console.println("PASS"); return 0; } diff --git a/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_trim.sts b/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_trim.sts index f71fcdc19..0be2160a9 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_trim.sts +++ b/static_core/plugins/ets/tests/ets_test_suite/intrinsics/string_trim.sts @@ -137,6 +137,5 @@ function main(): int { assert Esc.trimRight() == Empty; assert RusChars.trimRight() == RusChars; - console.println("PASS"); return 0; } diff --git a/static_core/plugins/ets/tests/ets_test_suite/intrinsics/stringbuilder.sts b/static_core/plugins/ets/tests/ets_test_suite/intrinsics/stringbuilder.sts index d06719e83..b231b1f0b 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/intrinsics/stringbuilder.sts +++ b/static_core/plugins/ets/tests/ets_test_suite/intrinsics/stringbuilder.sts @@ -160,6 +160,5 @@ function main(): int { console.println("FAIL"); return 127; } - console.println("PASS"); return 0; } diff --git a/static_core/runtime/asm_defines/asm_defines.def b/static_core/runtime/asm_defines/asm_defines.def index 0d63978fd..159e9ea6f 100644 --- a/static_core/runtime/asm_defines/asm_defines.def +++ b/static_core/runtime/asm_defines/asm_defines.def @@ -84,6 +84,7 @@ DEFINE_VALUE(MANAGED_THREAD_POST_WRB_TWO_OBJECTS_OFFSET, ManagedThread::GetTlsPo DEFINE_VALUE(MANAGED_THREAD_PRE_WRB_ENTRYPOINT_OFFSET, ManagedThread::GetTlsPreWrbEntrypointOffset()) DEFINE_VALUE(MANAGED_THREAD_STRING_CLASS_PTR_OFFSET, ManagedThread::GetTlsStringClassPointerOffset()) DEFINE_VALUE(MANAGED_THREAD_ARRAY_U16_CLASS_PTR_OFFSET, ManagedThread::GetTlsArrayU16ClassPointerOffset()) +DEFINE_VALUE(MANAGED_THREAD_ARRAY_U8_CLASS_PTR_OFFSET, ManagedThread::GetTlsArrayU8ClassPointerOffset()) DEFINE_VALUE(MANAGED_THREAD_PRE_BUFF_OFFSET, ManagedThread::GetPreBuffOffset()) DEFINE_VALUE(MANAGED_THREAD_LANGUAGE_EXTENSION_DATA_OFFSET, ManagedThread::GetLanguageExtensionsDataOffset()) DEFINE_VALUE(MANAGED_THREAD_INTERNAL_ID_OFFSET, ManagedThread::GetInternalIdOffset()) diff --git a/static_core/runtime/compiler.cpp b/static_core/runtime/compiler.cpp index a4a938108..e63b528ca 100644 --- a/static_core/runtime/compiler.cpp +++ b/static_core/runtime/compiler.cpp @@ -177,6 +177,14 @@ compiler::RuntimeInterface::ClassPtr PandaRuntimeInterface::GetArrayU16Class(Met return Runtime::GetCurrent()->GetClassLinker()->GetExtension(ctx)->GetClassRoot(ClassRoot::ARRAY_U16); } +compiler::RuntimeInterface::ClassPtr PandaRuntimeInterface::GetArrayU8Class(MethodPtr method) const +{ + ScopedMutatorLock lock; + auto *caller = MethodCast(method); + LanguageContext ctx = Runtime::GetCurrent()->GetLanguageContext(*caller); + return Runtime::GetCurrent()->GetClassLinker()->GetExtension(ctx)->GetClassRoot(ClassRoot::ARRAY_U8); +} + compiler::ClassType PandaRuntimeInterface::GetClassType(ClassPtr klassPtr) const { if (klassPtr == nullptr) { diff --git a/static_core/runtime/compiler.h b/static_core/runtime/compiler.h index c7b273ea0..07c68973e 100644 --- a/static_core/runtime/compiler.h +++ b/static_core/runtime/compiler.h @@ -394,6 +394,7 @@ public: size_t GetOffsetToConstArrayData(MethodPtr method, IdType id) const override; ClassPtr GetArrayU16Class(MethodPtr method) const override; + ClassPtr GetArrayU8Class(MethodPtr method) const override; /**********************************************************************************/ /// String information bool IsCompressedStringsEnabled() const override diff --git a/static_core/runtime/include/managed_thread.h b/static_core/runtime/include/managed_thread.h index d2cf18378..a93154336 100644 --- a/static_core/runtime/include/managed_thread.h +++ b/static_core/runtime/include/managed_thread.h @@ -233,6 +233,11 @@ public: stringClassPtr_ = p; } + void SetArrayU8ClassPtr(void *p) + { + arrayU8ClassPtr_ = p; + } + void SetArrayU16ClassPtr(void *p) { arrayU16ClassPtr_ = p; @@ -394,6 +399,10 @@ public: { return MEMBER_OFFSET(ManagedThread, stringClassPtr_); } + static constexpr uint32_t GetTlsArrayU8ClassPointerOffset() + { + return MEMBER_OFFSET(ManagedThread, arrayU8ClassPtr_); + } static constexpr uint32_t GetTlsArrayU16ClassPointerOffset() { return MEMBER_OFFSET(ManagedThread, arrayU16ClassPtr_); diff --git a/static_core/runtime/include/thread.h b/static_core/runtime/include/thread.h index 9636906cd..ec1328e5f 100644 --- a/static_core/runtime/include/thread.h +++ b/static_core/runtime/include/thread.h @@ -374,6 +374,7 @@ protected: void *postWrbTwoObjects_ {nullptr}; void *stringClassPtr_ {nullptr}; // ClassRoot::STRING void *arrayU16ClassPtr_ {nullptr}; // ClassRoot::ARRAY_U16 + void *arrayU8ClassPtr_ {nullptr}; // ClassRoot::ARRAY_U8 PandaVector *preBuff_ {nullptr}; void *languageExtensionData_ {nullptr}; #ifndef NDEBUG diff --git a/static_core/runtime/runtime.cpp b/static_core/runtime/runtime.cpp index ccb093724..7c5d63820 100644 --- a/static_core/runtime/runtime.cpp +++ b/static_core/runtime/runtime.cpp @@ -873,6 +873,7 @@ void Runtime::SetThreadClassPointers() if (ext != nullptr) { thread->SetStringClassPtr(ext->GetClassRoot(ClassRoot::STRING)); thread->SetArrayU16ClassPtr(ext->GetClassRoot(ClassRoot::ARRAY_U16)); + thread->SetArrayU8ClassPtr(ext->GetClassRoot(ClassRoot::ARRAY_U8)); } } -- Gitee From 627c52b06f2fbc1ce3b846c55e327c5a5b53dec8 Mon Sep 17 00:00:00 2001 From: Leonid Skvortsov Date: Fri, 4 Oct 2024 18:22:56 +0300 Subject: [PATCH 02/11] You know it, I know it, it's GN fix time! Signed-off-by: Leonid Skvortsov --- static_core/libllvmbackend/BUILD.gn | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/static_core/libllvmbackend/BUILD.gn b/static_core/libllvmbackend/BUILD.gn index 59356034f..395a68e96 100644 --- a/static_core/libllvmbackend/BUILD.gn +++ b/static_core/libllvmbackend/BUILD.gn @@ -195,12 +195,13 @@ if (is_llvmbackend) { extra_dependencies = [ "$ark_root/runtime:arkruntime_gen_intrinsics_yaml" ] } - entrypoints_yaml = "$ark_root/runtime/entrypoints/entrypoints.yaml" + entrypoints_yaml = rebase_path("$target_gen_dir/../runtime/entrypoints.yaml") ark_gen_file("libllvmbackend_entrypoints_gen_inl") { template_file = "$llvmbackend_templates_dir/entrypoints_gen.inl.erb" data = [ entrypoints_yaml ] api = [ "$llvmbackend_templates_dir/entrypoints.rb" ] output_file = "$target_gen_dir/entrypoints_gen.inl" + extra_dependencies = [ "$ark_root:concat_entrypoints_yamls" ] } ark_gen_file("libllvmbackend_entrypoints_llvm_ark_interface_gen_inl") { @@ -209,6 +210,7 @@ if (is_llvmbackend) { data = [ entrypoints_yaml ] api = [ "$llvmbackend_templates_dir/entrypoints.rb" ] output_file = "$target_gen_dir/entrypoints_llvm_ark_interface_gen.inl" + extra_dependencies = [ "$ark_root:concat_entrypoints_yamls" ] } ark_gen_file("libllvmbackend_llvm_passes_inl") { -- Gitee From 4bd37c793d51f945e8634091d46d79973fbe7b64 Mon Sep 17 00:00:00 2001 From: Roman Zhuykov Date: Fri, 27 Sep 2024 16:18:09 +0300 Subject: [PATCH 03/11] [CI] Clang-tidy/clang-format scripts adjustments Signed-off-by: Roman Zhuykov --- static_core/CMakeLists.txt | 2 +- static_core/cmake/ClangTidy.cmake | 6 +++ .../clang-tidy/clang-tidy_llvm_config.json | 10 ++++ .../scripts/clang-tidy/clang_tidy_check.py | 54 ++++++++++++++----- .../scripts/code_style/code_style_check.py | 21 +++++--- 5 files changed, 73 insertions(+), 20 deletions(-) create mode 100644 static_core/scripts/clang-tidy/clang-tidy_llvm_config.json diff --git a/static_core/CMakeLists.txt b/static_core/CMakeLists.txt index ddc400a3f..63d72c8c4 100644 --- a/static_core/CMakeLists.txt +++ b/static_core/CMakeLists.txt @@ -347,7 +347,7 @@ if(PANDA_WITH_TESTS) ) if (NOT PANDA_TARGET_MACOS) - add_dependencies(tests_full code-style-check) + add_dependencies(tests_full code-style-check doxygen-style-check clang-tidy-llvmbackend) endif() add_subdirectory(scripts) diff --git a/static_core/cmake/ClangTidy.cmake b/static_core/cmake/ClangTidy.cmake index 1d6bf74d8..444bf268b 100644 --- a/static_core/cmake/ClangTidy.cmake +++ b/static_core/cmake/ClangTidy.cmake @@ -40,3 +40,9 @@ add_custom_target(test-cmake-checker COMMAND ${PANDA_ROOT}/scripts/cmake-checker/cmake_checker.py ${PANDA_ROOT} TEST USES_TERMINAL ) + +add_custom_target(clang-tidy-llvmbackend + COMMAND ${PANDA_ROOT}/scripts/clang-tidy/clang_tidy_check.py ${PANDA_ROOT} ${PANDA_BINARY_ROOT} "--cfg-filter=${PANDA_ROOT}/scripts/clang-tidy/clang-tidy_llvm_config.json" + USES_TERMINAL + DEPENDS panda_gen_files +) diff --git a/static_core/scripts/clang-tidy/clang-tidy_llvm_config.json b/static_core/scripts/clang-tidy/clang-tidy_llvm_config.json new file mode 100644 index 000000000..ebf474cc2 --- /dev/null +++ b/static_core/scripts/clang-tidy/clang-tidy_llvm_config.json @@ -0,0 +1,10 @@ +[ + "libllvmbackend", + "irtoc/backend/", + "compiler/aot/aot_builder/aot_builder.cpp", + "compiler/aot/aot_builder/llvm_aot_builder.cpp", + "compiler/aot/aot_file.cpp", + "compiler/optimizer/ir/aot_data.cpp", + "compiler/tools/paoc/paoc.cpp", + "compiler/tools/paoc/paoc_llvm.cpp" +] diff --git a/static_core/scripts/clang-tidy/clang_tidy_check.py b/static_core/scripts/clang-tidy/clang_tidy_check.py index 9a5fcc476..b6882d65d 100755 --- a/static_core/scripts/clang-tidy/clang_tidy_check.py +++ b/static_core/scripts/clang-tidy/clang_tidy_check.py @@ -29,9 +29,13 @@ def get_args(): 'panda_dir', help='panda sources directory.', type=str) parser.add_argument( 'build_dir', help='panda build directory.', type=str) + parser.add_argument( + '--cfg-filter', type=str, action='store', dest='cfg_filter', + required=False, + help='Path to config with filenames to be checked. If missed all source files will be checked.') parser.add_argument( '--filename-filter', type=str, action='store', dest='filename_filter', - required=False, default="*", + required=False, help='Regexp for filename with path to it. If missed all source files will be checked.') parser.add_argument( '--full', action="store_true", help='Check all files with all compile keys.') @@ -207,7 +211,7 @@ default_disabled_checks = [ ] -def run_clang_tidy(src_path: str, panda_dir: str, build_dir: str, compile_args: str) -> bool: +def run_clang_tidy(src_path: str, panda_dir: str, build_dir: str, compile_args: str, delayed_stderr: list, job_num: int) -> bool: # Used by ctcache to provide a wrapper for real clang-tidy that will check the cache # before launching clang-tidy and save the result to ctcache server cmd_path = os.getenv('CLANG_TIDY_PATH') @@ -234,10 +238,14 @@ def run_clang_tidy(src_path: str, panda_dir: str, build_dir: str, compile_args: print("Note: bad output for ", src_path) return True - print('Failed: ' + ' '.join(cmd) + '\n' + out_msg) + failed_output = f'Failed: ' + ' '.join(cmd) + failed_output += f'\n{out_msg}\n' if e.stderr: - print(e.stderr.decode()) + failed_output += e.stderr.decode() + + delayed_stderr[job_num] = failed_output + print(failed_output) return False @@ -254,12 +262,15 @@ def get_full_path(relative_path: str, location_base: str, panda_dir: str, build_ def check_file_list(file_list: list, panda_dir: str, build_dir: str, proc_count: int) -> bool: pool = multiprocessing.Pool(proc_count) jobs = [] - for src, args in file_list: + manager = multiprocessing.Manager() + delayed_stderr = manager.list([None] * len(file_list)) + for i in range(len(file_list)): + src, args = file_list[i] msg = "Done clang-tidy: %s" % (src) proc = pool.apply_async(func=run_clang_tidy, args=( - src, panda_dir, build_dir, args)) + src, panda_dir, build_dir, args, delayed_stderr, i)) jobs.append((proc, msg)) # Wait for jobs to complete before exiting @@ -283,6 +294,7 @@ def check_file_list(file_list: list, panda_dir: str, build_dir: str, proc_count: # Safely terminate the pool pool.close() pool.join() + print('\n'.join([ds for ds in delayed_stderr if ds])) return main_ret_val @@ -403,10 +415,13 @@ def verify_uniq_element_list(uniq_element_list: list) -> bool: return len(uniq_element_list) == len(set(uniq_element_list)) -def verify_args(panda_dir: str, build_dir: str) -> str: +def verify_args(panda_dir: str, build_dir: str, filename_filter: str, cfg_filter: str): if not verify_uniq_element_list(default_disabled_checks): return "Error: Dupclicated defauls disabled checks" + if filename_filter and cfg_filter: + return "Error: --filename-filter and --cfg-filter cannot be used together, please remove one." + return "" @@ -452,6 +467,13 @@ def get_proc_count(cmd_ard : int) -> int: return multiprocessing.cpu_count() +def parse_config(cfg_filter): + cfg_data = None + with open(cfg_filter) as cfg: + cfg_data = json.load(cfg) + return f"({'|'.join(cfg_data)})" + + if __name__ == "__main__": arguments = get_args() files_list = [] @@ -459,17 +481,25 @@ if __name__ == "__main__": if not os.path.exists(os.path.join(arguments.build_dir, 'compile_commands.json')): sys.exit("Error: Missing file `compile_commands.json` in build directory") - err_msg = verify_args(arguments.panda_dir, arguments.build_dir) + err_msg = verify_args( + arguments.panda_dir, arguments.build_dir, arguments.filename_filter, arguments.cfg_filter) if err_msg: sys.exit(err_msg) - files_list = get_file_list( - arguments.panda_dir, arguments.build_dir, arguments.filename_filter) + filename_filter = "*" + + if arguments.filename_filter: + filename_filter = arguments.filename_filter + elif arguments.cfg_filter: + filename_filter = parse_config(arguments.cfg_filter) + + files_list = get_file_list(arguments.panda_dir, arguments.build_dir, filename_filter) if not files_list: sys.exit("Can't be prepaired source list." - "Please check availble in build `dir compile_commands.json`" - "and correcting of parameter `--filename-filter` if you use it.") + "Please check available in build `dir compile_commands.json`" + "and correcting of parameter `--filename-filter`" + " or `--cfg-filter` if you use it.") check_headers_in_es2panda_sources(arguments.panda_dir) print('Checked for system headers: Starting') diff --git a/static_core/scripts/code_style/code_style_check.py b/static_core/scripts/code_style/code_style_check.py index b3a8ad6c5..f8735d1e9 100755 --- a/static_core/scripts/code_style/code_style_check.py +++ b/static_core/scripts/code_style/code_style_check.py @@ -39,7 +39,7 @@ def get_args(): return parser.parse_args() -def run_clang_format(src_path, panda_dir, reformat, msg): +def run_clang_format(src_path, panda_dir, reformat, msg, delayed_stderr, job_num): check_cmd = [str(os.path.join(panda_dir, 'scripts', 'code_style', 'run_code_style_tools.sh'))] reformat_cmd = [CLANG_FORMAT, '-i'] @@ -56,11 +56,14 @@ def run_clang_format(src_path, panda_dir, reformat, msg): print("Note: missed output for ", src_path) return True - print('Failed: ', ' '.join(cmd)) - print(e.stdout.decode()) + failed_output = f'Failed: ' + ' '.join(cmd) + failed_output += f'\n{e.stdout.decode()}\n' if e.stderr: - print(e.stderr.decode()) + failed_output += e.stderr.decode() + + delayed_stderr[job_num] = failed_output + print(failed_output) return False @@ -84,16 +87,19 @@ def check_file_list(file_list : list, panda_dir : str, reformat : bool, proc_cou main_ret_val = True total_count = str(len(file_list)) idx = 0 - for src in file_list: + manager = multiprocessing.Manager() + delayed_stderr = manager.list([None] * len(file_list)) + for i in range(len(file_list)): + src = file_list[i] idx += 1 msg = "[%s/%s] Running clang-format: %s" % (str(idx), total_count, src) proc = pool.apply_async(func=run_clang_format, args=( - src, panda_dir, reformat, msg)) + src, panda_dir, reformat, msg, delayed_stderr, i)) jobs.append(proc) # Wait for jobs to complete before exiting while(not all([p.ready() for p in jobs])): - time.sleep(5) + time.sleep(1) for job in jobs: if not job.get(): @@ -103,6 +109,7 @@ def check_file_list(file_list : list, panda_dir : str, reformat : bool, proc_cou # Safely terminate the pool pool.close() pool.join() + print('\n'.join([ds for ds in delayed_stderr if ds])) return main_ret_val -- Gitee From 9b0f8da02e4690679d00bd1cbfaac7c6f5092b62 Mon Sep 17 00:00:00 2001 From: Roman Zhuykov Date: Thu, 26 Sep 2024 18:42:07 +0300 Subject: [PATCH 04/11] [CI] Tweak llvmaot options for etsstdlib Signed-off-by: Roman Zhuykov --- static_core/plugins/ets/CMakeLists.txt | 13 +++- static_core/plugins/ets/tests/CMakeLists.txt | 73 ++++++-------------- 2 files changed, 33 insertions(+), 53 deletions(-) diff --git a/static_core/plugins/ets/CMakeLists.txt b/static_core/plugins/ets/CMakeLists.txt index aa939c5aa..40530c4a8 100644 --- a/static_core/plugins/ets/CMakeLists.txt +++ b/static_core/plugins/ets/CMakeLists.txt @@ -126,10 +126,19 @@ endif() if(PANDA_WITH_COMPILER) add_subdirectory(compiler) - set (COMPILER_OPTIONS "--compiler-check-final=true") + if(PANDA_LLVM_AOT) + set(STDLIB_PAOC_MODE "llvm") + set(COMPILER_OPTIONS "--compiler-check-final=true" "--llvm-gc-check=true" "--llvm-pre-opt=2") + if (NOT PANDA_ENABLE_THREAD_SANITIZER) + set(COMPILER_OPTIONS ${COMPILER_OPTIONS} "--llvmaot-threads=4" "--llvmaot-methods-per-module=512") + endif() + else() + set(STDLIB_PAOC_MODE "aot") + set(COMPILER_OPTIONS "--compiler-check-final=true") + endif() add_custom_target(ets-compile-stdlib-default COMMENT "Running ark_aot compilation for etsstdlib with default options" - COMMAND ${CMAKE_SOURCE_DIR}/plugins/ets/compiler/tools/paoc_compile_stdlib.sh --prefix="${PANDA_RUN_PREFIX}" --binary-dir=${CMAKE_BINARY_DIR} -compiler-options="${COMPILER_OPTIONS}" -paoc-output=${CMAKE_CURRENT_BINARY_DIR}/etsstdlib.an + COMMAND ${CMAKE_SOURCE_DIR}/plugins/ets/compiler/tools/paoc_compile_stdlib.sh --prefix="${PANDA_RUN_PREFIX}" --binary-dir=${CMAKE_BINARY_DIR} -compiler-options="${COMPILER_OPTIONS}" --paoc-mode=${STDLIB_PAOC_MODE} -paoc-output=${CMAKE_CURRENT_BINARY_DIR}/etsstdlib.an DEPENDS ark_aot etsstdlib ) endif() diff --git a/static_core/plugins/ets/tests/CMakeLists.txt b/static_core/plugins/ets/tests/CMakeLists.txt index cfb5dfcc3..dba84cf13 100644 --- a/static_core/plugins/ets/tests/CMakeLists.txt +++ b/static_core/plugins/ets/tests/CMakeLists.txt @@ -402,51 +402,32 @@ endfunction() set (COMPILER_OPTIONS_OSR "--compiler-ignore-failures=true" ${COMPILER_OPTIONS}) function(compile_stdlib TARGET_ARCH) - add_custom_target(ets-compile-stdlib-aot-${TARGET_ARCH} - COMMENT "Running ark_aot compilation for etsstdlib for ${TARGET_ARCH} with default options" - COMMAND ${ARK_AOT_RUNNER} --binary-dir=${CMAKE_BINARY_DIR} --target-arch=${TARGET_ARCH} --paoc-mode=aot -compiler-options="${COMPILER_OPTIONS}" -paoc-output=etsstdlib_aot_${TARGET_ARCH}.an - DEPENDS ark_aot etsstdlib - ) - add_custom_target(ets-compile-stdlib-jit-${TARGET_ARCH} - COMMENT "Running ark_aot compilation for etsstdlib for ${TARGET_ARCH} with jit mode" - COMMAND ${ARK_AOT_RUNNER} --binary-dir=${CMAKE_BINARY_DIR} --target-arch=${TARGET_ARCH} --paoc-mode=jit -compiler-options="${COMPILER_OPTIONS}" -paoc-output=etsstdlib_jit_${TARGET_ARCH}.an - DEPENDS ark_aot etsstdlib - ) - add_custom_target(ets-compile-stdlib-aot-${TARGET_ARCH}-no-inline - COMMENT "Running ark_aot compilation for etsstdlib for ${TARGET_ARCH} without inlining" - COMMAND ${ARK_AOT_RUNNER} --binary-dir=${CMAKE_BINARY_DIR} --target-arch=${TARGET_ARCH} --paoc-mode=aot -compiler-options="${COMPILER_OPTIONS_NO_INLINE}" -paoc-output=etsstdlib_aot_${TARGET_ARCH}_no_inline.an - DEPENDS ark_aot etsstdlib - ) - add_custom_target(ets-compile-stdlib-aot-${TARGET_ARCH}-stw - COMMENT "Running ark_aot compilation for etsstdlib for ${TARGET_ARCH} with gc stw" - COMMAND ${ARK_AOT_RUNNER} --binary-dir=${CMAKE_BINARY_DIR} --target-arch=${TARGET_ARCH} --paoc-mode=aot -compiler-options="${COMPILER_OPTIONS_GC_STW}" -paoc-output=etsstdlib_aot_${TARGET_ARCH}_stw.an - DEPENDS ark_aot etsstdlib - ) - add_dependencies(ets-compile-stdlib ets-compile-stdlib-aot-${TARGET_ARCH} ets-compile-stdlib-jit-${TARGET_ARCH} ets-compile-stdlib-aot-${TARGET_ARCH}-no-inline ets-compile-stdlib-aot-${TARGET_ARCH}-stw) if (PANDA_LLVM_AOT) - add_custom_target(ets-compile-stdlib-llvm-${TARGET_ARCH} - COMMENT "Running ark_aot compilation for etsstdlib for ${TARGET_ARCH} with llvm" - COMMAND ${ARK_AOT_RUNNER} --binary-dir=${CMAKE_BINARY_DIR} --target-arch=${TARGET_ARCH} --paoc-mode=llvm -compiler-options="${COMPILER_OPTIONS_LLVM}" -paoc-output=etsstdlib_llvmaot_${TARGET_ARCH}.an + add_custom_target(ets-compile-stdlib-llvmaot-${TARGET_ARCH} + COMMENT "Running LLVMAOT compilation for etsstdlib for ${TARGET_ARCH}" + COMMAND ${ARK_AOT_RUNNER} --binary-dir=${CMAKE_BINARY_DIR} --target-arch=${TARGET_ARCH} --paoc-mode=llvm -compiler-options="${COMPILER_OPTIONS}" -paoc-output=etsstdlib_llvmaot_${TARGET_ARCH}.an DEPENDS ark_aot etsstdlib ) - add_custom_target(ets-compile-stdlib-llvm-pre-opt-2-${TARGET_ARCH} - COMMENT "Running ark_aot compilation for etsstdlib for ${TARGET_ARCH} with llvm pre-opt" - COMMAND ${ARK_AOT_RUNNER} --binary-dir=${CMAKE_BINARY_DIR} --target-arch=${TARGET_ARCH} --paoc-mode=llvm -compiler-options="${COMPILER_OPTIONS_LLVM_PRE_OPT}" -paoc-output=etsstdlib_llvmaot_pre_opt_2_${TARGET_ARCH}.an + add_custom_target(ets-compile-stdlib-llvmaot-${TARGET_ARCH}-no-inline + COMMENT "Running LLVMAOT compilation for etsstdlib for ${TARGET_ARCH} without inlining" + COMMAND ${ARK_AOT_RUNNER} --binary-dir=${CMAKE_BINARY_DIR} --target-arch=${TARGET_ARCH} --paoc-mode=llvm -compiler-options="${COMPILER_OPTIONS_NO_INLINE}" -paoc-output=etsstdlib_llvmaot_${TARGET_ARCH}_no_inline.an DEPENDS ark_aot etsstdlib ) - add_dependencies( - ets-compile-stdlib - ets-compile-stdlib-llvm-${TARGET_ARCH} - ets-compile-stdlib-llvm-pre-opt-2-${TARGET_ARCH} + add_custom_target(ets-compile-stdlib-llvmaot-${TARGET_ARCH}-no-pre-opt + COMMENT "Running LLVMAOT compilation for etsstdlib for ${TARGET_ARCH} with llvm without pre-opt" + COMMAND ${ARK_AOT_RUNNER} --binary-dir=${CMAKE_BINARY_DIR} --target-arch=${TARGET_ARCH} --paoc-mode=llvm -compiler-options="${COMPILER_OPTIONS_NO_PRE_OPT}" -paoc-output=etsstdlib_llvmaot_${TARGET_ARCH}_no_pre_opt.an + DEPENDS ark_aot etsstdlib ) - endif() - if (TARGET_ARCH STREQUAL "arm64") - add_custom_target(ets-compile-stdlib-osr-${TARGET_ARCH} - COMMENT "Running ark_aot compilation for etsstdlib for ${TARGET_ARCH} with osr mode" - COMMAND ${ARK_AOT_RUNNER} --binary-dir=${CMAKE_BINARY_DIR} --target-arch=${TARGET_ARCH} --paoc-mode=osr -compiler-options="${COMPILER_OPTIONS_OSR}" -paoc-output=etsstdlib_osr_${TARGET_ARCH}.an + add_custom_target(ets-compile-stdlib-llvmaot-${TARGET_ARCH}-stw + COMMENT "Running LLVMAOT compilation for etsstdlib for ${TARGET_ARCH} with gc stw" + COMMAND ${ARK_AOT_RUNNER} --binary-dir=${CMAKE_BINARY_DIR} --target-arch=${TARGET_ARCH} --paoc-mode=llvm -compiler-options="${COMPILER_OPTIONS_GC_STW}" -paoc-output=etsstdlib_llvmaot_${TARGET_ARCH}_stw.an DEPENDS ark_aot etsstdlib ) - add_dependencies(ets-compile-stdlib ets-compile-stdlib-osr-${TARGET_ARCH}) + add_dependencies(ets-compile-stdlib + ets-compile-stdlib-llvmaot-${TARGET_ARCH} + ets-compile-stdlib-llvmaot-${TARGET_ARCH}-no-inline + ets-compile-stdlib-llvmaot-${TARGET_ARCH}-no-pre-opt + ets-compile-stdlib-llvmaot-${TARGET_ARCH}-stw) endif() endfunction() @@ -465,23 +446,13 @@ endif() if(PANDA_TEST_COMPILE_STDLIB) set (ARK_AOT_RUNNER ${CMAKE_SOURCE_DIR}/plugins/ets/compiler/tools/paoc_compile_stdlib.sh) - if (NOT PANDA_CI_TESTING_MODE STREQUAL "Nightly") - set (COMPILER_OPTIONS "--compiler-check-final=true") - if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") - set (COMPILER_OPTIONS ${COMPILER_OPTIONS} "--compiler-inst-graph-coloring-limit=2000") - endif() + set (COMPILER_OPTIONS "--compiler-check-final=true" "--llvm-gc-check=true" "--llvm-pre-opt=2") + if (NOT PANDA_ENABLE_THREAD_SANITIZER) + set (COMPILER_OPTIONS ${COMPILER_OPTIONS} "--llvmaot-threads=4" "--llvmaot-methods-per-module=512") endif() set (COMPILER_OPTIONS_NO_INLINE "--compiler-inlining=false" ${COMPILER_OPTIONS}) set (COMPILER_OPTIONS_GC_STW "--gc-type=stw" ${COMPILER_OPTIONS}) - if (PANDA_LLVM_AOT) - set (COMPILER_OPTIONS_LLVM ${COMPILER_OPTIONS}) - set (COMPILER_OPTIONS_LLVM_PRE_OPT "--llvm-pre-opt=2" ${COMPILER_OPTIONS}) - # NOTE(zdenis): False positives come from libLLVM.so - if (NOT PANDA_ENABLE_THREAD_SANITIZER) - set (COMPILER_OPTIONS_LLVM "--llvmaot-threads=4" "--llvmaot-methods-per-module=512" ${COMPILER_OPTIONS_LLVM}) - set (COMPILER_OPTIONS_LLVM_PRE_OPT "--llvmaot-threads=4" "--llvmaot-methods-per-module=512" ${COMPILER_OPTIONS_LLVM_PRE_OPT}) - endif() - endif () + set (COMPILER_OPTIONS_NO_PRE_OPT ${COMPILER_OPTIONS} "--llvm-pre-opt=0") add_custom_target(ets-compile-stdlib) if (PANDA_COMPILER_TARGET_X86_64) compile_stdlib(x86_64) -- Gitee From f0238c928843894e8cf18eb2f449176a4ec80159 Mon Sep 17 00:00:00 2001 From: Roman Zhuykov Date: Thu, 26 Sep 2024 18:43:07 +0300 Subject: [PATCH 05/11] [CI] Enable llvm in SDK build script Signed-off-by: Roman Zhuykov --- static_core/scripts/sdk/build_sdk.sh | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/static_core/scripts/sdk/build_sdk.sh b/static_core/scripts/sdk/build_sdk.sh index f829de077..cdff08dad 100755 --- a/static_core/scripts/sdk/build_sdk.sh +++ b/static_core/scripts/sdk/build_sdk.sh @@ -65,7 +65,7 @@ function build_panda() { COMMONS_CMAKE_ARGS="\ -GNinja \ -S$ARK_ROOT \ - -DCMAKE_BUILD_TYPE=$PANDA_SDK_BUILD_TYPE \ + -DCMAKE_BUILD_TYPE=${PANDA_SDK_BUILD_TYPE} \ -DPANDA_PRODUCT_BUILD=$product_build \ -DPANDA_WITH_ECMASCRIPT=ON \ -DPANDA_WITH_ETS=ON \ @@ -107,7 +107,9 @@ function linux_tools() { -DPANDA_CROSS_AARCH64_TOOLCHAIN_FILE=cmake/toolchain/cross-ohos-musl-aarch64.cmake \ -DTOOLCHAIN_SYSROOT=$OHOS_SDK_NATIVE/sysroot \ -DTOOLCHAIN_CLANG_ROOT=$OHOS_SDK_NATIVE/llvm \ - -DPANDA_WITH_ECMASCRIPT=ON" + -DPANDA_WITH_ECMASCRIPT=ON \ + -DPANDA_LLVM_BACKEND=ON \ + -DLLVM_TARGET_PATH=/opt/llvm-15-${PANDA_SDK_BUILD_TYPE,,}-x86_64" local linux_build_targets="ark ark_aot ark_disasm ark_link es2panda e2p_test_plugin etsnative" build_panda "$linux_build_dir" "$linux_cmake_args" "$linux_build_targets" copy_into_sdk "$linux_build_dir" "$PANDA_SDK_PATH/linux_host_tools" "$SCRIPT_DIR"/linux_host_tools.txt @@ -131,7 +133,10 @@ function ohos() { -DTOOLCHAIN_SYSROOT=$OHOS_SDK_NATIVE/sysroot \ -DTOOLCHAIN_CLANG_ROOT=$OHOS_SDK_NATIVE/llvm \ -DPANDA_ETS_INTEROP_JS=ON \ - -DPANDA_WITH_ECMASCRIPT=ON" + -DPANDA_WITH_ECMASCRIPT=ON \ + -DPANDA_LLVM_BACKEND=ON \ + -DLLVM_HOST_PATH=/opt/llvm-15-${PANDA_SDK_BUILD_TYPE,,}-x86_64 \ + -DLLVM_TARGET_PATH=/opt/llvm-15-release-ohos" local ohos_build_targets="ark ark_aot arkruntime arkassembler ets_interop_js_napi e2p_test_plugin etsnative" build_panda "$ohos_build_dir" "$target_cmake_args" "$ohos_build_targets" copy_into_sdk "$ohos_build_dir" "$taget_sdk_dir" "$SCRIPT_DIR"/ohos_arm64.txt -- Gitee From f29bb7a43ee77716e5839918524d3086c3fba060 Mon Sep 17 00:00:00 2001 From: Roman Zhuykov Date: Fri, 27 Sep 2024 13:53:48 +0300 Subject: [PATCH 06/11] [CI] cts-generator: add arm64-host and llvm-irtoc runs --- static_core/tests/CMakeLists.txt | 3 ++ .../tests/cts-generator/CMakeLists.txt | 29 +------------------ 2 files changed, 4 insertions(+), 28 deletions(-) diff --git a/static_core/tests/CMakeLists.txt b/static_core/tests/CMakeLists.txt index aa236767b..697a203d1 100644 --- a/static_core/tests/CMakeLists.txt +++ b/static_core/tests/CMakeLists.txt @@ -31,6 +31,9 @@ add_dependencies(irtoc-interpreter-tests irtoc-opcode-suite) if(NOT PANDA_TARGET_AMD64 OR PANDA_TARGET_WINDOWS) add_dependencies(core_tests cts-assembly regression) add_subdirectory(cts-coverage-tool) + if(PANDA_TARGET_ARM64 AND NOT CMAKE_CROSSCOMPILING) + add_subdirectory(cts-generator) + endif() else() add_custom_target(verifier-tests COMMENT "Regression tests for verifier") add_dependencies(core_tests cts-assembly regression verifier-tests) diff --git a/static_core/tests/cts-generator/CMakeLists.txt b/static_core/tests/cts-generator/CMakeLists.txt index 92b74363c..aba30003c 100644 --- a/static_core/tests/cts-generator/CMakeLists.txt +++ b/static_core/tests/cts-generator/CMakeLists.txt @@ -157,19 +157,7 @@ if(NOT CMAKE_CROSSCOMPILING) -p "${PROJECT_BINARY_DIR}/../../" -x "${CTS_TEMP_DIR}" -v 1 - ${QUICKENER_ARGLAUNCH} - --global-timeout ${PANDA_CTS_TESTING_TIMEOUT} - --timeout ${PANDA_CTS_TEST_TIMEOUT} - -j ${PANDA_CTS_JOBS_NUMBER} - --verifier-config "${PROJECT_BINARY_DIR}/verifier.config" - ${CTS_TEST_PRLIMIT_OPTIONS} - ${CTS_TEST_SELECT_OPTION_ARGS} VERBATIM - COMMAND ${CTS_TEST_RUNNER} - -t "${CTS_GENERATED_DIR}" - -p "${PROJECT_BINARY_DIR}/../../" - -x "${CTS_TEMP_DIR}" - -v 1 - -o "--interpreter-type=cpp" + -o "--compiler-enable-jit=false" ${QUICKENER_ARGLAUNCH} --global-timeout ${PANDA_CTS_TESTING_TIMEOUT} --timeout ${PANDA_CTS_TEST_TIMEOUT} @@ -178,21 +166,6 @@ if(NOT CMAKE_CROSSCOMPILING) ${CTS_TEST_PRLIMIT_OPTIONS} --exclude-tag verifier ${CTS_TEST_SELECT_OPTION_ARGS} VERBATIM - COMMAND ${CTS_TEST_RUNNER} - -t "${CTS_GENERATED_DIR}" - -p "${PROJECT_BINARY_DIR}/../../" - -x "${CTS_TEMP_DIR}" - -v 1 - ${QUICKENER_ARGLAUNCH} - --global-timeout ${PANDA_CTS_TESTING_TIMEOUT} - --timeout ${PANDA_CTS_TEST_TIMEOUT} - -j ${PANDA_CTS_JOBS_NUMBER} - --verifier-config "${PROJECT_BINARY_DIR}/verifier.config" - -o "--compiler-hotness-threshold=0" - -o "--no-async-jit" - ${CTS_TEST_PRLIMIT_OPTIONS} - --exclude-tag verifier - ${CTS_TEST_SELECT_OPTION_JIT_ARGS} VERBATIM DEPENDS "$" "$" "${TARGETFILE_ARKQUICK}" "$" "${OUTPUT_FILES}" ) -- Gitee From 4b6920b96ae5671a0ceaf3b0df8c71787e6cf6dc Mon Sep 17 00:00:00 2001 From: Roman Zhuykov Date: Fri, 27 Sep 2024 16:17:32 +0300 Subject: [PATCH 07/11] [CI] Add 'expr_5.sts' to AOT ignore lists Signed-off-by: Roman Zhuykov --- .../test-lists/ets-cts/ets-cts-ignored-AMD64-AOT.txt | 3 +++ .../test-lists/ets-cts/ets-cts-ignored-ARM64-AOT.txt | 3 +++ 2 files changed, 6 insertions(+) diff --git a/static_core/tests/tests-u-runner/test-lists/ets-cts/ets-cts-ignored-AMD64-AOT.txt b/static_core/tests/tests-u-runner/test-lists/ets-cts/ets-cts-ignored-AMD64-AOT.txt index 700c64e0f..cebacdb75 100644 --- a/static_core/tests/tests-u-runner/test-lists/ets-cts/ets-cts-ignored-AMD64-AOT.txt +++ b/static_core/tests/tests-u-runner/test-lists/ets-cts/ets-cts-ignored-AMD64-AOT.txt @@ -163,3 +163,6 @@ # 17965 ERRNO: 12 (Cannot allocate memory) 17.experimental_features/16.coroutines/01.create_and_launch_coroutine/c_16.sts + +# LLVM AOT removes unused allocation +17.experimental_features/02.array_creation_expressions/01.runtime_evaluation_of_array_creation_expressions/expr_5.sts diff --git a/static_core/tests/tests-u-runner/test-lists/ets-cts/ets-cts-ignored-ARM64-AOT.txt b/static_core/tests/tests-u-runner/test-lists/ets-cts/ets-cts-ignored-ARM64-AOT.txt index 700c64e0f..cebacdb75 100644 --- a/static_core/tests/tests-u-runner/test-lists/ets-cts/ets-cts-ignored-ARM64-AOT.txt +++ b/static_core/tests/tests-u-runner/test-lists/ets-cts/ets-cts-ignored-ARM64-AOT.txt @@ -163,3 +163,6 @@ # 17965 ERRNO: 12 (Cannot allocate memory) 17.experimental_features/16.coroutines/01.create_and_launch_coroutine/c_16.sts + +# LLVM AOT removes unused allocation +17.experimental_features/02.array_creation_expressions/01.runtime_evaluation_of_array_creation_expressions/expr_5.sts -- Gitee From 540b4905d7431e329d6cc0181e962f095d981188 Mon Sep 17 00:00:00 2001 From: Roman Zhuykov Date: Tue, 24 Sep 2024 18:55:49 +0300 Subject: [PATCH 08/11] Dump method name with signature Signed-off-by: Roman Zhuykov --- static_core/compiler/tools/paoc/paoc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static_core/compiler/tools/paoc/paoc.cpp b/static_core/compiler/tools/paoc/paoc.cpp index 2f834e999..8bbfb7be8 100644 --- a/static_core/compiler/tools/paoc/paoc.cpp +++ b/static_core/compiler/tools/paoc/paoc.cpp @@ -64,7 +64,7 @@ void Paoc::CompilingContext::DumpStatistics() const { ASSERT(stats); char sep = ','; - *stats << method->GetFullName() << sep; + *stats << '"' << method->GetFullName(true) << '"' << sep; *stats << "paoc-summary" << sep; *stats << allocator.GetAllocatedSize() << sep; *stats << graphLocalAllocator.GetAllocatedSize() << '\n'; -- Gitee From 36a8b1778b7e71c446fc8afae2bd19a5b17897ab Mon Sep 17 00:00:00 2001 From: Denis Zavedeev Date: Tue, 24 Sep 2024 18:14:18 +0300 Subject: [PATCH 09/11] Detect missing llvm_codegen_func --- static_core/libllvmbackend/lowering/llvm_ir_constructor.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/static_core/libllvmbackend/lowering/llvm_ir_constructor.cpp b/static_core/libllvmbackend/lowering/llvm_ir_constructor.cpp index 4c976f6c0..ae93aebb2 100644 --- a/static_core/libllvmbackend/lowering/llvm_ir_constructor.cpp +++ b/static_core/libllvmbackend/lowering/llvm_ir_constructor.cpp @@ -4417,6 +4417,7 @@ void LLVMIrConstructor::VisitIntrinsic(GraphVisitor *v, Inst *inst) return; } } + ASSERT(!EncodesBuiltin(ctor->GetGraph()->GetRuntime(), entryId, ctor->GetGraph()->GetArch())); // Create call otherwise auto result = ctor->CreateIntrinsicCall(inst); if (inst->GetType() != DataType::VOID) { -- Gitee From bd9f8ef1f0867e1724efe8f6c2c4ddfc39cd1842 Mon Sep 17 00:00:00 2001 From: Leonid Skvortsov Date: Tue, 8 Oct 2024 18:09:30 +0300 Subject: [PATCH 10/11] Add NonNull attribute to intrinsic calls --- static_core/libllvmbackend/lowering/llvm_ir_constructor.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/static_core/libllvmbackend/lowering/llvm_ir_constructor.cpp b/static_core/libllvmbackend/lowering/llvm_ir_constructor.cpp index ae93aebb2..ddf18532f 100644 --- a/static_core/libllvmbackend/lowering/llvm_ir_constructor.cpp +++ b/static_core/libllvmbackend/lowering/llvm_ir_constructor.cpp @@ -4421,6 +4421,11 @@ void LLVMIrConstructor::VisitIntrinsic(GraphVisitor *v, Inst *inst) // Create call otherwise auto result = ctor->CreateIntrinsicCall(inst); if (inst->GetType() != DataType::VOID) { + if (inst->NoNullPtr()) { + ASSERT(inst->GetType() == DataType::REFERENCE); + ASSERT(result->getType()->isPointerTy()); + result->addRetAttr(llvm::Attribute::NonNull); + } ctor->ValueMapAdd(inst, result); } } -- Gitee From 002b0c45b338f9e4fc0446cfcd5244fcd747603a Mon Sep 17 00:00:00 2001 From: Leonid Skvortsov Date: Thu, 10 Oct 2024 17:13:52 +0300 Subject: [PATCH 11/11] Add Assertion --- static_core/libllvmbackend/lowering/llvm_ir_constructor.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/static_core/libllvmbackend/lowering/llvm_ir_constructor.cpp b/static_core/libllvmbackend/lowering/llvm_ir_constructor.cpp index ddf18532f..7a62eb50b 100644 --- a/static_core/libllvmbackend/lowering/llvm_ir_constructor.cpp +++ b/static_core/libllvmbackend/lowering/llvm_ir_constructor.cpp @@ -4414,6 +4414,7 @@ void LLVMIrConstructor::VisitIntrinsic(GraphVisitor *v, Inst *inst) if (g_options.IsCompilerEncodeIntrinsics()) { bool lowered = ctor->TryEmitIntrinsic(inst, entryId); if (lowered) { + ASSERT(!inst->NoNullPtr()); return; } } -- Gitee