[libcxx-dev] dllimport vs inline methods in MSVC mode/clang-cl

Martin Storsjö via libcxx-dev libcxx-dev at lists.llvm.org
Mon Nov 2 05:26:15 PST 2020


Hi,

I'm looking into an issue with how dllimport of classes/methods works when 
operating in MSVC mode (i.e. building with clang-cl).

Methods that aren't supposed to be part of the ABI interface are marked 
with _LIBCPP_INLINE_VISIBILITY (expanding to __attribute__ 
((__exclude_from_explicit_instantiation__)), or potentially __attribute__ 
((__always_inline__))).

When the whole class is marked dllimport, clang doesn't seem to react to 
these attributes at all.

This is a big practical problem for the method 
std::filesystem::path::u8string. The method is marked with 
_LIBCPP_INLINE_VISIBILITY, but ends up exported/imported nevertheless.

In C++17, this method returns a basic_string<char>, while in C++20 it 
returns a basic_string<char8_t>. With itanium name mangling, the return 
type of a method isn't included in the signature, but with MSVC C++ name 
mangling, the two versions of the method are distinctly different.

So despite the best efforts, a DLL build of the library exports the 
function u8string (with whichever return type it had when the lib was 
built), and a caller that is built with a different language version will 
fail to link as it tries to import the symbol from the DLL.

A small testcase of the issue looks like this:


extern "C" void externFunc(void *ptr);

class __declspec(dllimport) MyClass {
public:
     void inline
     __attribute__ ((__always_inline__))
     __attribute__ ((__exclude_from_explicit_instantiation__))
     inlineFunc() {
         externFunc(this);
     }
};

void caller(MyClass *obj) {
    obj->inlineFunc();
}


When building an object file out of this, it ends up with an extern call 
to __imp_<decoration>inlineFunc. (The rules for dllexport/import are 
different in mingw mode, where it ends up behaving as hoped/intended.)

Is there any way around this, to mark that we really, really, want to 
inline any call to this method, despite being in a dllimported class?

// Martin



More information about the libcxx-dev mailing list