blob: d54988de67b2b4413335e141ac0eaa40ec1786ee [file] [log] [blame]
/* Managing temporary directories and their content within libgccjit.so
Copyright (C) 2014-2022 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 JIT_TEMPDIR_H
#define JIT_TEMPDIR_H
#include "jit-logging.h"
namespace gcc {
namespace jit {
/* A class to keep track of the jit::playback::context's tempdir.
The tempdir has the following layout:
/tmp/libgccjit-XXXXXX/
./fake.c
(doesn't exist, but the rest of the
compiler needs a source code filename)
./fake.s
(created by toplev::main)
./fake.so
(created by playback::context::convert_to_dso).
It is normally deleted from the filesystem in the playback::context's
dtor, unless GCC_JIT_BOOL_OPTION_KEEP_INTERMEDIATES was set. */
class tempdir : public log_user
{
public:
tempdir (logger *logger, int keep_intermediates);
~tempdir ();
bool create ();
const char * get_path () const { return m_path_tempdir; }
const char * get_path_c_file () const { return m_path_c_file; }
const char * get_path_s_file () const { return m_path_s_file; }
const char * get_path_so_file () const { return m_path_so_file; }
/* Add PATH to the vec of tempfiles that must be unlinked.
Take ownership of the buffer PATH; it will be freed. */
void add_temp_file (char *path) { m_tempfiles.safe_push (path); }
private:
/* Was GCC_JIT_BOOL_OPTION_KEEP_INTERMEDIATES set? If so, keep the
on-disk tempdir around after this wrapper object goes away. */
int m_keep_intermediates;
/* Allocated using xmalloc (by xstrdup). */
char *m_path_template;
/* This either aliases m_path_template, or is NULL. */
char *m_path_tempdir;
/* The following are allocated using xmalloc. */
char *m_path_c_file;
char *m_path_s_file;
char *m_path_so_file;
/* Other files within the tempdir to be cleaned up:
- certain ahead-of-time compilation artifacts (.o and .exe files)
- dumpfiles that were requested via gcc_jit_context_enable_dump. */
auto_vec <char *> m_tempfiles;
};
} // namespace gcc::jit
} // namespace gcc
#endif /* JIT_TEMPDIR_H */