-
Notifications
You must be signed in to change notification settings - Fork 15.2k
[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. |
mstorsjo
left a comment
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. |
mstorsjo
left a comment
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_DEFAULTas theHandleparameter toDLSymto search all modules for a symbol. Unfortunately, RTLD_DEFAULT is defined as NULL, so the existing checks of theProcesshandle meantDLSymwould never be called on Cygwin. Use the existing&Invalidsentinel instead ofnullptrfor theProcesshandle.