13af6ab5fSopenharmony_ci/**
23af6ab5fSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
33af6ab5fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
43af6ab5fSopenharmony_ci * you may not use this file except in compliance with the License.
53af6ab5fSopenharmony_ci * You may obtain a copy of the License at
63af6ab5fSopenharmony_ci *
73af6ab5fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
83af6ab5fSopenharmony_ci *
93af6ab5fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
103af6ab5fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
113af6ab5fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123af6ab5fSopenharmony_ci * See the License for the specific language governing permissions and
133af6ab5fSopenharmony_ci * limitations under the License.
143af6ab5fSopenharmony_ci */
153af6ab5fSopenharmony_ci
163af6ab5fSopenharmony_ci#include "arena_allocator.h"
173af6ab5fSopenharmony_ci#include "mergeProgram.h"
183af6ab5fSopenharmony_ci#include "options.h"
193af6ab5fSopenharmony_ci#include "protobufSnapshotGenerator.h"
203af6ab5fSopenharmony_ci
213af6ab5fSopenharmony_ci#include <assembly-emitter.h>
223af6ab5fSopenharmony_ci#include <mem/pool_manager.h>
233af6ab5fSopenharmony_ci
243af6ab5fSopenharmony_cinamespace panda::proto {
253af6ab5fSopenharmony_ciusing mem::MemConfig;
263af6ab5fSopenharmony_ci
273af6ab5fSopenharmony_ciclass ProtoMemManager {
283af6ab5fSopenharmony_cipublic:
293af6ab5fSopenharmony_ci    explicit ProtoMemManager()
303af6ab5fSopenharmony_ci    {
313af6ab5fSopenharmony_ci        constexpr auto COMPILER_SIZE = 512_MB;
323af6ab5fSopenharmony_ci
333af6ab5fSopenharmony_ci        MemConfig::Initialize(0, 0, COMPILER_SIZE, 0);
343af6ab5fSopenharmony_ci        PoolManager::Initialize(PoolType::MMAP);
353af6ab5fSopenharmony_ci    }
363af6ab5fSopenharmony_ci
373af6ab5fSopenharmony_ci    NO_COPY_SEMANTIC(ProtoMemManager);
383af6ab5fSopenharmony_ci    NO_MOVE_SEMANTIC(ProtoMemManager);
393af6ab5fSopenharmony_ci
403af6ab5fSopenharmony_ci    ~ProtoMemManager()
413af6ab5fSopenharmony_ci    {
423af6ab5fSopenharmony_ci        PoolManager::Finalize();
433af6ab5fSopenharmony_ci        MemConfig::Finalize();
443af6ab5fSopenharmony_ci    }
453af6ab5fSopenharmony_ci};
463af6ab5fSopenharmony_ci
473af6ab5fSopenharmony_ciint Run(int argc, const char **argv)
483af6ab5fSopenharmony_ci{
493af6ab5fSopenharmony_ci    auto options = std::make_unique<Options>();
503af6ab5fSopenharmony_ci    if (!options->Parse(argc, argv)) {
513af6ab5fSopenharmony_ci        std::cerr << options->ErrorMsg() << std::endl;
523af6ab5fSopenharmony_ci        return 1;
533af6ab5fSopenharmony_ci    }
543af6ab5fSopenharmony_ci
553af6ab5fSopenharmony_ci    std::string protoPathInput = options->protoPathInput();
563af6ab5fSopenharmony_ci    std::string protoBinSuffix = options->protoBinSuffix();
573af6ab5fSopenharmony_ci    std::string outputFilePath = options->outputFilePath();
583af6ab5fSopenharmony_ci    if (outputFilePath.empty()) {
593af6ab5fSopenharmony_ci        outputFilePath = panda::os::file::File::GetExecutablePath().Value();
603af6ab5fSopenharmony_ci    }
613af6ab5fSopenharmony_ci
623af6ab5fSopenharmony_ci    std::vector<std::string> protoFiles;
633af6ab5fSopenharmony_ci    if (!MergeProgram::CollectProtoFiles(protoPathInput, protoBinSuffix, protoFiles)) {
643af6ab5fSopenharmony_ci        return 1;
653af6ab5fSopenharmony_ci    }
663af6ab5fSopenharmony_ci
673af6ab5fSopenharmony_ci    panda::ArenaAllocator allocator(panda::SpaceType::SPACE_TYPE_COMPILER, nullptr, true);
683af6ab5fSopenharmony_ci
693af6ab5fSopenharmony_ci    std::vector<panda::pandasm::Program *> programs;
703af6ab5fSopenharmony_ci    programs.reserve(protoFiles.size());
713af6ab5fSopenharmony_ci    for (size_t i = 0; i < protoFiles.size(); i++) {
723af6ab5fSopenharmony_ci        auto *prog = allocator.New<panda::pandasm::Program>();
733af6ab5fSopenharmony_ci        programs.emplace_back(prog);
743af6ab5fSopenharmony_ci    }
753af6ab5fSopenharmony_ci
763af6ab5fSopenharmony_ci    size_t idx = 0;
773af6ab5fSopenharmony_ci    for (auto &protoFile : protoFiles) {
783af6ab5fSopenharmony_ci        proto::ProtobufSnapshotGenerator::GenerateProgram(protoFile, *(programs[idx++]), &allocator);
793af6ab5fSopenharmony_ci    }
803af6ab5fSopenharmony_ci
813af6ab5fSopenharmony_ci    std::string outputFileName = outputFilePath.append(panda::os::file::File::GetPathDelim()).
823af6ab5fSopenharmony_ci        append(options->outputFileName());
833af6ab5fSopenharmony_ci    if (!panda::pandasm::AsmEmitter::EmitPrograms(panda::os::file::File::GetExtendedFilePath(outputFileName), programs,
843af6ab5fSopenharmony_ci        true)) {
853af6ab5fSopenharmony_ci        return 1;
863af6ab5fSopenharmony_ci    }
873af6ab5fSopenharmony_ci
883af6ab5fSopenharmony_ci    return 0;
893af6ab5fSopenharmony_ci}
903af6ab5fSopenharmony_ci} // namespace panda::proto
913af6ab5fSopenharmony_ci
923af6ab5fSopenharmony_ciint main(int argc, const char **argv)
933af6ab5fSopenharmony_ci{
943af6ab5fSopenharmony_ci    panda::proto::ProtoMemManager mm;
953af6ab5fSopenharmony_ci    return panda::proto::Run(argc, argv);
963af6ab5fSopenharmony_ci}
97