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