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 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 30namespace gcc { 31namespace jit { 32 33/* Constructor for gcc::jit::result. */ 34 35result:: 36result(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 48result::~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 68void * 69result:: 70get_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 95void * 96result:: 97get_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