-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[Support][Cygwin] Fix handling of Process symbol lookup. #143072
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
[Support][Cygwin] Fix handling of Process symbol lookup. #143072
Conversation
In Unix/DynamicLibrary.inc, it was already known that Cygwin required use of RTLD_DEFAULT as the "Handle" parameter to DLSym to search all modules for a symbol. Unfortunately RTLD_DEFAULT is defined as NULL, so the existing checks of the "Process" handle meant DLSym would never be called on Cygwin. Add a bool to indicate whether the Process handle was set instead.
@llvm/pr-subscribers-platform-windows @llvm/pr-subscribers-llvm-support Author: None (jeremyd2019) ChangesIn Unix/DynamicLibrary.inc, it was already known that Cygwin required use of Full diff: https://github.com/llvm/llvm-project/pull/143072.diff 1 Files Affected:
diff --git a/llvm/lib/Support/DynamicLibrary.cpp b/llvm/lib/Support/DynamicLibrary.cpp
index 531c035ab9266..34c2dc2e56227 100644
--- a/llvm/lib/Support/DynamicLibrary.cpp
+++ b/llvm/lib/Support/DynamicLibrary.cpp
@@ -26,6 +26,7 @@ class DynamicLibrary::HandleSet {
typedef std::vector<void *> HandleList;
HandleList Handles;
void *Process = nullptr;
+ bool ProcessAdded = false;
public:
static void *DLOpen(const char *Filename, std::string *Err);
@@ -66,6 +67,7 @@ class DynamicLibrary::HandleSet {
}
#endif
Process = Handle;
+ ProcessAdded = true;
}
return true;
}
@@ -97,11 +99,11 @@ class DynamicLibrary::HandleSet {
assert(!((Order & SO_LoadedFirst) && (Order & SO_LoadedLast)) &&
"Invalid Ordering");
- if (!Process || (Order & SO_LoadedFirst)) {
+ if (!ProcessAdded || (Order & SO_LoadedFirst)) {
if (void *Ptr = LibLookup(Symbol, Order))
return Ptr;
}
- if (Process) {
+ if (ProcessAdded) {
// Use OS facilities to search the current binary and all loaded libs.
if (void *Ptr = DLSym(Process, Symbol))
return Ptr;
|
cc @mstorsjo this seemed less invasive than trying to use This brought llvm test failures on Cygwin down from 110 to 50. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
|
So instead of having |
…ool is not needed
LGTM (but I don't have access to approve) |
Could #143246 be the cause of the CI failure? |
…ional bool is not needed also fix platform .inc files
I think it was probably the missing checks in the .inc files, which I've now added |
I'm still waiting on mine, or I'd be looking harder at reviewing and approving your PRs. Hopefully @mstorsjo can take care of this chore in the meantime. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
In Unix/DynamicLibrary.inc, it was already known that Cygwin required use of `RTLD_DEFAULT` as the `Handle` parameter to `DLSym` to search all modules for a symbol. Unfortunately, RTLD_DEFAULT is defined as NULL, so the existing checks of the `Process` handle meant `DLSym` would never be called on Cygwin. Use the existing `&Invalid` sentinel instead of `nullptr` for the `Process` handle.
In Unix/DynamicLibrary.inc, it was already known that Cygwin required use of `RTLD_DEFAULT` as the `Handle` parameter to `DLSym` to search all modules for a symbol. Unfortunately, RTLD_DEFAULT is defined as NULL, so the existing checks of the `Process` handle meant `DLSym` would never be called on Cygwin. Use the existing `&Invalid` sentinel instead of `nullptr` for the `Process` handle.
In Unix/DynamicLibrary.inc, it was already known that Cygwin required use of `RTLD_DEFAULT` as the `Handle` parameter to `DLSym` to search all modules for a symbol. Unfortunately, RTLD_DEFAULT is defined as NULL, so the existing checks of the `Process` handle meant `DLSym` would never be called on Cygwin. Use the existing `&Invalid` sentinel instead of `nullptr` for the `Process` handle.
In Unix/DynamicLibrary.inc, it was already known that Cygwin required use of
RTLD_DEFAULT
as theHandle
parameter toDLSym
to search all modules for a symbol. Unfortunately, RTLD_DEFAULT is defined as NULL, so the existing checks of theProcess
handle meantDLSym
would never be called on Cygwin. Use the existing&Invalid
sentinel instead ofnullptr
for theProcess
handle.