aboutsummaryrefslogtreecommitdiff
path: root/gcc/pex.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/pex.h')
-rw-r--r--gcc/pex.h100
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 */