diff --git a/es2panda/aot/main.cpp b/es2panda/aot/main.cpp index 76053181fd4c38f6e426f515e0e4cdbabb33a54d..a3cca1d0828741c03160be550366d9a6fd200821 100644 --- a/es2panda/aot/main.cpp +++ b/es2panda/aot/main.cpp @@ -80,24 +80,25 @@ static void DumpPandaFileSizeStatistic(std::map &stat) std::cout << "total: " << totalSize << std::endl; } -static bool GenerateMultiProgram(const std::unordered_map &programs, +static bool GenerateMultiProgram(const std::map &programsInfo, const std::unique_ptr &options) { if (options->CompilerOptions().mergeAbc) { std::vector progs; - for (auto &prog: programs) { - progs.push_back(prog.first); + for (const auto &progInfo: programsInfo) { + progs.push_back(progInfo.second->program); } - auto output = programs.begin()->second; + const auto &output = options->CompilerOutput(); if (!panda::pandasm::AsmEmitter::EmitPrograms(output, progs, true)) { std::cerr << "Failed to emit merged program, error: " << panda::pandasm::AsmEmitter::GetLastError() << std::endl; return false; } } else { - for (auto &prog: programs) { - if (!panda::pandasm::AsmEmitter::Emit(prog.second, *(prog.first), nullptr, nullptr, true)) { + for (const auto &progInfo: programsInfo) { + const auto &output = options->OutputFiles().at(progInfo.first); + if (!panda::pandasm::AsmEmitter::Emit(output, *(progInfo.second->program), nullptr, nullptr, true)) { std::cout << "Failed to emit single program, error: " << panda::pandasm::AsmEmitter::GetLastError() << std::endl; return false; @@ -107,34 +108,41 @@ static bool GenerateMultiProgram(const std::unordered_map &programs, +static void DumpProgramInfos(const std::map &programsInfo, const std::unique_ptr &options) { - int optLevel = options->OptLevel(); - bool dumpSize = options->SizeStat(); - const es2panda::CompilerOptions compilerOptions = options->CompilerOptions(); + const es2panda::CompilerOptions &compilerOptions = options->CompilerOptions(); if (compilerOptions.dumpAsm || compilerOptions.dumpLiteralBuffer) { - for (auto &prog : programs) { + for (const auto &progInfo : programsInfo) { if (compilerOptions.dumpAsm) { - es2panda::Compiler::DumpAsm(prog.first); + es2panda::Compiler::DumpAsm(progInfo.second->program); } if (compilerOptions.dumpLiteralBuffer) { - panda::es2panda::util::Dumper::DumpLiterals(prog.first->literalarray_table); + panda::es2panda::util::Dumper::DumpLiterals(progInfo.second->program->literalarray_table); } } } +} - if (programs.size() > 1) { - return GenerateMultiProgram(programs, options); +static bool GenerateProgram(const std::map &programsInfo, + const std::unique_ptr &options) +{ + DumpProgramInfos(programsInfo, options); + if (programsInfo.size() > 1) { + return GenerateMultiProgram(programsInfo, options); } else { - auto *prog = programs.begin()->first; + auto *prog = programsInfo.begin()->second->program; + + int optLevel = options->OptLevel(); + bool dumpSize = options->SizeStat(); std::map stat; std::map *statp = optLevel != 0 ? &stat : nullptr; panda::pandasm::AsmEmitter::PandaFileToPandaAsmMaps maps {}; panda::pandasm::AsmEmitter::PandaFileToPandaAsmMaps *mapsp = optLevel != 0 ? &maps : nullptr; - auto output = programs.begin()->second; + const auto &output = options->OutputFiles().empty() ? options->CompilerOutput() : + options->OutputFiles().at(programsInfo.begin()->first); if (output.empty()) { GenerateBase64Output(prog, mapsp); return true; @@ -160,20 +168,13 @@ static bool GenerateProgram(const std::unordered_map &programsInfo, const std::unique_ptr &options, size_t expectedProgsCount) { - std::unordered_map programs; - for (auto &info : programsInfo) { - auto outputFileName = options->OutputFiles().empty() ? options->CompilerOutput() : - options->OutputFiles().at(info.first); - programs.insert({info.second->program, outputFileName}); - } - - if (programs.size() != expectedProgsCount) { + if (programsInfo.size() != expectedProgsCount) { std::cerr << "the size of programs is expected to be " << expectedProgsCount - << ", but is " << programs.size() << std::endl; + << ", but is " << programsInfo.size() << std::endl; return false; } - if (!GenerateProgram(programs, options)) { + if (!GenerateProgram(programsInfo, options)) { std::cerr << "GenerateProgram Failed!" << std::endl; return false; } diff --git a/merge_abc/protos/assemblyFunction.proto b/merge_abc/protos/assemblyFunction.proto index 731877424a248cbb8b1fcbc40c3e5a39be607b8e..28fcff032ee7d6bf1087c7f3732593c9f5926c91 100644 --- a/merge_abc/protos/assemblyFunction.proto +++ b/merge_abc/protos/assemblyFunction.proto @@ -75,5 +75,6 @@ message Function { SourceLocation bodyLocation = 15; optional FileLocation fileLocation = 16; uint32 function_kind = 17; + uint64 slotsNum = 18; } diff --git a/merge_abc/src/assemblyFunctionProto.cpp b/merge_abc/src/assemblyFunctionProto.cpp index f5f9972365d15cf091dae509321871b69c9440c7..c0129bc255abd62984b17b51c1f9d7a4d590d112 100644 --- a/merge_abc/src/assemblyFunctionProto.cpp +++ b/merge_abc/src/assemblyFunctionProto.cpp @@ -106,6 +106,7 @@ void Function::Serialize(const panda::pandasm::Function &function, protoPanda::F FileLocation::Serialize(fileLocation.value(), *protoFileLocation); } protoFunction.set_function_kind(static_cast(function.function_kind)); + protoFunction.set_slotsnum(function.slots_num); } void Function::Deserialize(const protoPanda::Function &protoFunction, panda::pandasm::Function &function, @@ -164,5 +165,6 @@ void Function::Deserialize(const protoPanda::Function &protoFunction, panda::pan FileLocation::Deserialize(protoFunction.filelocation(), function.file_location); } function.SetFunctionKind(static_cast(protoFunction.function_kind())); + function.SetSlotsNum(protoFunction.slotsnum()); } } // panda::proto