/* * 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. */ #include "assembly-function.h" #include "assembly-ins.h" namespace panda::pandasm { std::set panda::pandasm::Function::CollectStringsFromFunctionInsns() const { std::set function_strings {}; for (const auto &panda_insn : this->ins) { switch (panda_insn.opcode) { % Panda::instructions.group_by(&:mnemonic).each do |mnemonic, group| % insn = group[index_of_max(group.map(&:format).map(&:size))] % if (insn.properties.include?('string_id') || insn.properties.include?('method_id')) case Opcode::<%= insn.asm_token %>: { % num_id = 0 % property_idx_start = 0 % insn.operands.each do |op| % if op.id? % id_properties = insn.properties.slice(property_idx_start, insn.properties.length - property_idx_start) % id_properties.each_with_index do |prop, prop_idx| % if prop == 'string_id' function_strings.insert(panda_insn.ids[<%= num_id %>]); % property_idx_start += prop_idx + 1 % num_id += 1 % break % elsif prop == 'method_id' function_strings.insert(panda_insn.ids[<%= num_id %>]); % property_idx_start += prop_idx + 1 % num_id += 1 % break % elsif prop == 'literalarray_id' % property_idx_start += prop_idx + 1 % num_id += 1 % break % else % next % end % end % else % next % end % end break; } % else % next % end % end default: break; } } return function_strings; } } // namespace panda::pandasm