1 /* Internals of libgccjit: implementation of gcc_jit_result
2    Copyright (C) 2013-2020 Free Software Foundation, Inc.
3    Contributed by David Malcolm <dmalcolm@redhat.com>.
4 
5 This file is part of GCC.
6 
7 GCC is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
11 
12 GCC is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20 
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 
25 #include "jit-common.h"
26 #include "jit-logging.h"
27 #include "jit-result.h"
28 #include "jit-tempdir.h"
29 
30 namespace gcc {
31 namespace jit {
32 
33 /* Constructor for gcc::jit::result.  */
34 
35 result::
result(logger * logger,void * dso_handle,tempdir * tempdir_)36 result(logger *logger, void *dso_handle, tempdir *tempdir_) :
37   log_user (logger),
38   m_dso_handle (dso_handle),
39   m_tempdir (tempdir_)
40 {
41   JIT_LOG_SCOPE (get_logger ());
42 }
43 
44 /* gcc::jit::result's destructor.
45 
46    Called implicitly by gcc_jit_result_release.  */
47 
~result()48 result::~result()
49 {
50   JIT_LOG_SCOPE (get_logger ());
51 
52   dlclose (m_dso_handle);
53 
54   /* Responsibility for cleaning up the tempdir (including "fake.so" within
55      the filesystem) might have been handed to us by the playback::context,
56      so that the cleanup can be delayed (see PR jit/64206).
57 
58      If so, clean it up now.  */
59   delete m_tempdir;
60 }
61 
62 /* Attempt to locate the given function by name within the
63    playback::result, using dlsym.
64 
65    Implements the post-error-checking part of
66    gcc_jit_result_get_code.  */
67 
68 void *
69 result::
get_code(const char * funcname)70 get_code (const char *funcname)
71 {
72   JIT_LOG_SCOPE (get_logger ());
73 
74   void *code;
75   const char *error;
76 
77   /* Clear any existing error.  */
78   dlerror ();
79 
80   code = dlsym (m_dso_handle, funcname);
81 
82   if ((error = dlerror()) != NULL)  {
83     fprintf(stderr, "%s\n", error);
84   }
85 
86   return code;
87 }
88 
89 /* Attempt to locate the given global by name within the
90    playback::result, using dlsym.
91 
92    Implements the post-error-checking part of
93    gcc_jit_result_get_global.  */
94 
95 void *
96 result::
get_global(const char * name)97 get_global (const char *name)
98 {
99   JIT_LOG_SCOPE (get_logger ());
100 
101   void *global;
102   const char *error;
103 
104   /* Clear any existing error.  */
105   dlerror ();
106 
107   global = dlsym (m_dso_handle, name);
108 
109   if ((error = dlerror()) != NULL)  {
110     fprintf(stderr, "%s\n", error);
111   }
112 
113   return global;
114 }
115 
116 } // namespace gcc::jit
117 
118 } // namespace gcc
119