1 /* Internals of libgccjit: implementation of gcc_jit_result 2 Copyright (C) 2013-2015 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:: 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 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:: 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:: 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