Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

mingw: Fix build with patch from Liu Hao #3164

Merged
merged 1 commit into from
Sep 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 5 additions & 18 deletions gcc/rust/checks/errors/borrowck/rust-borrow-checker.cc
Original file line number Diff line number Diff line change
Expand Up @@ -27,20 +27,6 @@
namespace Rust {
namespace HIR {

void
mkdir_wrapped (const std::string &dirname)
{
int ret;
#ifdef _WIN32
ret = _mkdir (dirname.c_str ());
#elif unix
ret = mkdir (dirname.c_str (), 0775);
#elif __APPLE__
ret = mkdir (dirname.c_str (), 0775);
#endif
rust_assert (ret == 0 || errno == EEXIST);
}

void
dump_function_bir (const std::string &filename, BIR::Function &func,
const std::string &name)
Expand All @@ -64,11 +50,11 @@ BorrowChecker::go (HIR::Crate &crate)

if (enable_dump_bir)
{
mkdir_wrapped ("bir_dump");
mkdir ("bir_dump", 0755);
auto &mappings = Analysis::Mappings::get ();
crate_name
= *mappings.get_crate_name (crate.get_mappings ().get_crate_num ());
mkdir_wrapped ("nll_facts_gccrs");
mkdir ("nll_facts_gccrs", 0755);
}

FunctionCollector collector;
Expand Down Expand Up @@ -96,8 +82,9 @@ BorrowChecker::go (HIR::Crate &crate)

if (enable_dump_bir)
{
mkdir_wrapped ("nll_facts_gccrs/"
+ func->get_function_name ().as_string ());
auto dir
= "nll_facts_gccrs/" + func->get_function_name ().as_string ();
mkdir (dir.c_str (), 0755);
auto dump_facts_to_file
= [&] (const std::string &suffix,
void (Polonius::Facts::*fn) (std::ostream &) const) {
Expand Down
36 changes: 28 additions & 8 deletions gcc/rust/expand/rust-proc-macro.cc
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,10 @@
#include "rust-token-converter.h"
#include "rust-attributes.h"

#ifndef _WIN32
#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#else
#include <dlfcn.h>
#endif

Expand Down Expand Up @@ -100,12 +103,16 @@ static_assert (

} // namespace

template <typename Symbol, typename Callback>
template <typename Handle, typename Symbol, typename Callback>
bool
register_callback (void *handle, Symbol, std::string symbol_name,
register_callback (Handle handle, Symbol, std::string symbol_name,
Callback callback)
{
#ifdef _WIN32
FARPROC addr = GetProcAddress (handle, symbol_name.c_str ());
#else
void *addr = dlsym (handle, symbol_name.c_str ());
#endif
if (addr == nullptr)
{
rust_error_at (UNDEF_LOCATION,
Expand All @@ -127,14 +134,27 @@ register_callback (void *handle, Symbol, std::string symbol_name,
const ProcMacro::ProcmacroArray *
load_macros_array (std::string path)
{
#ifndef _WIN32
#ifdef _WIN32
HMODULE handle = LoadLibraryA (path.c_str ());
// We're leaking the handle since we can't ever unload it
if (!handle)
{
char msg[300];
FormatMessageA (FORMAT_MESSAGE_FROM_SYSTEM
| FORMAT_MESSAGE_IGNORE_INSERTS,
nullptr, GetLastError (), 0, msg, sizeof msg, nullptr);
rust_debug ("Error whilst opening procedural macro: %s", msg);
return nullptr;
}
#else
void *handle = dlopen (path.c_str (), RTLD_LAZY | RTLD_LOCAL);
// We're leaking the handle since we can't ever unload it
if (!handle)
{
rust_debug ("Error whilst opening procedural macro: %s", dlerror ());
return nullptr;
}
#endif

if (!REGISTER_CALLBACK (handle, __gccrs_proc_macro_ts_from_str_,
tokenstream_from_string))
Expand All @@ -151,12 +171,12 @@ load_macros_array (std::string path)
auto symbol_name = generate_proc_macro_decls_symbol (0 /* FIXME */);

return *reinterpret_cast<const ProcMacro::ProcmacroArray **> (
dlsym (handle, symbol_name.c_str ()));
#ifdef _WIN32
GetProcAddress (handle, symbol_name.c_str ())
#else
rust_sorry_at (UNDEF_LOCATION,
"Procedural macros are not yet supported on windows host");
rust_unreachable ();
dlsym (handle, symbol_name.c_str ())
#endif
);
}

#undef REGISTER_CALLBACK
Expand Down
2 changes: 1 addition & 1 deletion gcc/rust/parse/rust-parse.cc
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ extract_module_path (const AST::AttrVec &inner_attrs,
// Source: rustc compiler
// (https://github.com/rust-lang/rust/blob/9863bf51a52b8e61bcad312f81b5193d53099f9f/compiler/rustc_expand/src/module.rs#L174)
#if defined(HAVE_DOS_BASED_FILE_SYSTEM)
path.replace ('/', '\\');
std::replace (path.begin (), path.end (), '/', '\\');
#endif /* HAVE_DOS_BASED_FILE_SYSTEM */

return path;
Expand Down
Loading