[cfe-dev] [libc++] Standard types on Windows declared dllimport, no definitions compiled

Janus Lynggaard Thorborg via cfe-dev cfe-dev at lists.llvm.org
Fri Feb 23 04:06:43 PST 2018


Hello,

I'm scavenging parts of libc++ as a standard library for some C++ jitting
using clang+llvm ORC.

I precompile the required sources of libc++ plus my runtimes, emitting that
as LLVM IR. The C++ "script" gets compiled as another translation unit, and
they are added as two llvm::Modules into a IRCompileLayer. Thus, I don't
link to any system runtimes.

Some types from libc++ create issues though, like std::string. I get
unresolved externals for member functions like string::data() and the
destructor. Looking at the IR dump of the user translation unit, functions
like string::data are only declared, and marked dllimport (and compiling
the libc++ source doesn't emit the definitions, either).

Any idea what gives? I looked at the attributes attached to
std::basic_string, which seems to be a mixture of _LIBCPP_INLINE_VISIBILITY
for the member functions, _LIBCPP_TEMPLATE_VIS on the class itself, and
_LIBCPP_EXTERN_TEMPLATE + _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS on the common
base class. I guess a mixture of these ends up defining the import/export
traits of std types in libc++, but I don't really know how to control them,
so I was hoping someone could give some quick pointers.

In my case,  _LIBCPP_INLINE_VISIBILITY  equals the always_inline attribute,
so why clang would emit dllimports for inline visible methods and not just
inline them I don't know, I'm starting to think types contained inside
libc++ system headers are treated in a special way depending on flags I
don't know.

Again, any hints would be appreciated :)

Regards, Janus
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20180223/5fe354fc/attachment.html>


More information about the cfe-dev mailing list