diff options
Diffstat (limited to 'gcc/pex.h')
-rw-r--r-- | gcc/pex.h | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/gcc/pex.h b/gcc/pex.h new file mode 100644 index 0000000..9c6816a --- /dev/null +++ b/gcc/pex.h @@ -0,0 +1,100 @@ +/* C++ wrapper around libiberty's pex API. + Copyright (C) 2025 Free Software Foundation, Inc. + Contributed by David Malcolm <dmalcolm@redhat.com>. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + +GCC is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +<http://www.gnu.org/licenses/>. */ + +#ifndef GCC_PEX_H +#define GCC_PEX_H + +struct file_wrapper +{ + enum class ownership { owned, borrowed }; + + file_wrapper (FILE *file, enum ownership ownership) + : m_file (file), + m_ownership (ownership) + { + } + ~file_wrapper () + { + if (m_ownership == ownership::owned) + { + gcc_assert (m_file); + fclose (m_file); + } + } + + std::unique_ptr<std::vector<char>> + read_all (); + + FILE *m_file; + enum ownership m_ownership; +}; + +// RAII wrapper around pex_obj + +struct pex +{ + pex (int flags, const char *pname, const char *tempbase) + : m_obj (pex_init (flags, pname, tempbase)) + { + } + + ~pex () + { + pex_free (m_obj); + } + + const char * + run (int flags, const char *executable, char * const *argv, + const char *outname, const char *errname, int *err) + { + return pex_run (m_obj, flags, executable, argv, outname, errname, err); + } + + const char * + run (int flags, const char *executable, const std::vector<std::string> &args, + const char *outname, const char *errname, int *err); + + file_wrapper + input_file (int flags, const char *in_name) + { + return file_wrapper (pex_input_file (m_obj, flags, in_name), + /* closed on first call to pex_run. */ + file_wrapper::ownership::borrowed); + } + + file_wrapper + input_pipe (bool binary = true) + { + return file_wrapper (pex_input_pipe (m_obj, binary), + /* closed on first call to pex_run. */ + file_wrapper::ownership::borrowed); + } + + file_wrapper + read_output (bool binary = true) + { + return file_wrapper (pex_read_output (m_obj, binary), + file_wrapper::ownership::borrowed); + } + + pex_obj *m_obj; +}; + +#endif /* GCC_PEX_H */ |