1b60736ecSDimitry Andric //===--- TargetExecutionUtils.cpp - Execution utils for target processes --===//
2b60736ecSDimitry Andric //
3b60736ecSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4b60736ecSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5b60736ecSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6b60736ecSDimitry Andric //
7b60736ecSDimitry Andric //===----------------------------------------------------------------------===//
8b60736ecSDimitry Andric
9b60736ecSDimitry Andric #include "llvm/ExecutionEngine/Orc/TargetProcess/TargetExecutionUtils.h"
10b60736ecSDimitry Andric
11b60736ecSDimitry Andric #include <vector>
12b60736ecSDimitry Andric
13b60736ecSDimitry Andric namespace llvm {
14b60736ecSDimitry Andric namespace orc {
15b60736ecSDimitry Andric
runAsMain(int (* Main)(int,char * []),ArrayRef<std::string> Args,std::optional<StringRef> ProgramName)16b60736ecSDimitry Andric int runAsMain(int (*Main)(int, char *[]), ArrayRef<std::string> Args,
17e3b55780SDimitry Andric std::optional<StringRef> ProgramName) {
18b60736ecSDimitry Andric std::vector<std::unique_ptr<char[]>> ArgVStorage;
19b60736ecSDimitry Andric std::vector<char *> ArgV;
20b60736ecSDimitry Andric
21b60736ecSDimitry Andric ArgVStorage.reserve(Args.size() + (ProgramName ? 1 : 0));
22b60736ecSDimitry Andric ArgV.reserve(Args.size() + 1 + (ProgramName ? 1 : 0));
23b60736ecSDimitry Andric
24b60736ecSDimitry Andric if (ProgramName) {
25b60736ecSDimitry Andric ArgVStorage.push_back(std::make_unique<char[]>(ProgramName->size() + 1));
26b60736ecSDimitry Andric llvm::copy(*ProgramName, &ArgVStorage.back()[0]);
27b60736ecSDimitry Andric ArgVStorage.back()[ProgramName->size()] = '\0';
28b60736ecSDimitry Andric ArgV.push_back(ArgVStorage.back().get());
29b60736ecSDimitry Andric }
30b60736ecSDimitry Andric
31b60736ecSDimitry Andric for (const auto &Arg : Args) {
32b60736ecSDimitry Andric ArgVStorage.push_back(std::make_unique<char[]>(Arg.size() + 1));
33b60736ecSDimitry Andric llvm::copy(Arg, &ArgVStorage.back()[0]);
34b60736ecSDimitry Andric ArgVStorage.back()[Arg.size()] = '\0';
35b60736ecSDimitry Andric ArgV.push_back(ArgVStorage.back().get());
36b60736ecSDimitry Andric }
37b60736ecSDimitry Andric ArgV.push_back(nullptr);
38b60736ecSDimitry Andric
39b60736ecSDimitry Andric return Main(Args.size() + !!ProgramName, ArgV.data());
40b60736ecSDimitry Andric }
41b60736ecSDimitry Andric
runAsVoidFunction(int (* Func)(void))42e3b55780SDimitry Andric int runAsVoidFunction(int (*Func)(void)) { return Func(); }
43e3b55780SDimitry Andric
runAsIntFunction(int (* Func)(int),int Arg)44e3b55780SDimitry Andric int runAsIntFunction(int (*Func)(int), int Arg) { return Func(Arg); }
45e3b55780SDimitry Andric
46b60736ecSDimitry Andric } // End namespace orc.
47b60736ecSDimitry Andric } // End namespace llvm.
48