Skip to content

Support EII on Windows MSVC#158723

Open
AsakuraMizu wants to merge 1 commit into
rust-lang:mainfrom
AsakuraMizu:windows-msvc-eii
Open

Support EII on Windows MSVC#158723
AsakuraMizu wants to merge 1 commit into
rust-lang:mainfrom
AsakuraMizu:windows-msvc-eii

Conversation

@AsakuraMizu

Copy link
Copy Markdown
Contributor

Tracking issue: #125418

The previous PR #158294 made function EIIs work on Windows MSVC. This PR fixes support for static EIIs, enabling full EII support on Windows MSVC.

The following fixes are included:

  • Keep EII statics out of LLVM internalization
  • Mark EII static symbols as dllimport
  • Emit MSVC __imp_<symbol> stubs for aliases to static data

Note: LLVMAddAlias2 was incorrectly declared in the llvm-wrapper extern block previously.

@rustbot rustbot added A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Jul 3, 2026
@rustbot

rustbot commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

r? @adwinwhite

rustbot has assigned @adwinwhite.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

Why was this reviewer chosen?

The reviewer was selected based on:

  • Owners of files modified in this PR: compiler
  • compiler expanded to 75 candidates
  • Random selection from 21 candidates

@rust-log-analyzer

This comment has been minimized.

@adwinwhite

Copy link
Copy Markdown
Contributor

@rustbot reroll

@rustbot rustbot assigned eholk and unassigned adwinwhite Jul 8, 2026
&& !llvm::is_declaration(val)
})
.map(|val| (val, llvm::Linkage::ExternalLinkage)),
base::iter_global_aliases(llmod).filter_map(|val| {

@bjorn3 bjorn3 Jul 8, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you change this to a .map().filter() the filter code should be almost identical to the filter code of iter_globals, which may be a bit easier to understand. You could also try if something like the following would work:

iter::chain(
    base::iter_globals(llmod),
    base::iter_global_aliases(llmod)
        .filter(|&val| llvm::LLVMGetTypeKind(unsafe { llvm::LLVMGlobalGetValueType(val) }).to_rust() != llvm::TypeKind::Function)
)
    .map(|val| (val, llvm::get_linkage(val))
    .filter(|(val, linkage)| matches!(linkage, llvm::Linkage::ExternalLinkage | llvm::Linkage::WeakAnyLinkage) && !llvm::is_declaration(val))

View changes since the review

@bjorn3 bjorn3 added the F-extern_item_impls `#![feature(extern_item_impls)]` label Jul 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. F-extern_item_impls `#![feature(extern_item_impls)]` S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants