Skip to content

Commit 91e219c

Browse files
committed
Exported all additional symbols on macOS.
Many functions in libc++ are marked with _LIBCPP_INLINE_VISIBILITY. This means they are only exported when actually used. This is why exporting just the templates themselves failed to export their functions but listing the functions themselves worked. We need to define _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS to have the functions always exported. We use _LIBCPP_VERSION to detect if we use libc++ i.e. Clang's standard C++ library. Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent e5aaa2e commit 91e219c

File tree

8 files changed

+55
-16
lines changed

8 files changed

+55
-16
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1+
#include <ciso646>
2+
3+
#ifdef _LIBCPP_VERSION
4+
#define _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS
5+
#endif
6+
17
#include <string>
28

39

4-
template __attribute__((visibility("default"))) std::basic_string<char, std::char_traits<char>, std::allocator<char>>::basic_string();
5-
template __attribute__((visibility("default"))) std::basic_string<char, std::char_traits<char>, std::allocator<char>>::~basic_string() noexcept;
6-
template __attribute__((visibility("default"))) std::basic_string<char, std::char_traits<char>, std::allocator<char>>& std::basic_string<char, std::char_traits<char>, std::allocator<char>>::assign(const std::basic_string<char, std::char_traits<char>, std::allocator<char>>::value_type*);
7-
template __attribute__((visibility("default"))) const std::basic_string<char, std::char_traits<char>, std::allocator<char>>::value_type* std::basic_string<char, std::char_traits<char>, std::allocator<char>>::c_str() const noexcept;
10+
template class std::char_traits<char>;
11+
template class std::allocator<char>;
12+
template class std::basic_string<char, std::char_traits<char>, std::allocator<char>>;

src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/Std-symbols.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
#include <ciso646>
2+
3+
#ifdef _LIBCPP_VERSION
4+
#define _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS
5+
#endif
6+
17
#include <string>
28

39

Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1+
#include <ciso646>
2+
3+
#ifdef _LIBCPP_VERSION
4+
#define _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS
5+
#endif
6+
17
#include <string>
28

39

4-
template __attribute__((visibility("default"))) std::basic_string<char, std::char_traits<char>, std::allocator<char>>::basic_string();
5-
template __attribute__((visibility("default"))) std::basic_string<char, std::char_traits<char>, std::allocator<char>>::~basic_string() noexcept;
6-
template __attribute__((visibility("default"))) std::basic_string<char, std::char_traits<char>, std::allocator<char>>& std::basic_string<char, std::char_traits<char>, std::allocator<char>>::assign(const std::basic_string<char, std::char_traits<char>, std::allocator<char>>::value_type*);
7-
template __attribute__((visibility("default"))) const std::basic_string<char, std::char_traits<char>, std::allocator<char>>::value_type* std::basic_string<char, std::char_traits<char>, std::allocator<char>>::c_str() const noexcept;
10+
template class std::char_traits<char>;
11+
template class std::allocator<char>;
12+
template class std::basic_string<char, std::char_traits<char>, std::allocator<char>>;

src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/Std-symbols.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
#include <ciso646>
2+
3+
#ifdef _LIBCPP_VERSION
4+
#define _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS
5+
#endif
6+
17
#include <string>
28

39

src/CppParser/Bindings/CSharp/x86_64-linux-gnu/Std-symbols.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
#include <ciso646>
2+
3+
#ifdef _LIBCPP_VERSION
4+
#define _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS
5+
#endif
6+
17
#include <string>
28

39

src/CppParser/Bindings/CSharp/x86_64-pc-win32-msvc/Std-symbols.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
#include <ciso646>
2+
3+
#ifdef _LIBCPP_VERSION
4+
#define _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS
5+
#endif
6+
17
#include <string>
28

39

src/Generator/Passes/SymbolsCodeGenerator.cs

+12-7
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
using CppSharp.AST;
66
using CppSharp.AST.Extensions;
77
using CppSharp.Generators;
8-
using CppSharp.Parser;
98

109
namespace CppSharp.Passes
1110
{
@@ -20,6 +19,16 @@ public SymbolsCodeGenerator(BindingContext context, IEnumerable<TranslationUnit>
2019

2120
public override void Process()
2221
{
22+
WriteLine("#include <ciso646>");
23+
NewLine();
24+
25+
// check if we use the Clang standard C++ lib and if so,
26+
// make sure we export all symbols marked with _LIBCPP_INLINE_VISIBILITY
27+
WriteLine("#ifdef _LIBCPP_VERSION");
28+
WriteLine(" #define _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS");
29+
WriteLine("#endif");
30+
NewLine();
31+
2332
if (TranslationUnit.Module == Options.SystemModule)
2433
WriteLine("#include <string>");
2534
else
@@ -62,12 +71,8 @@ public override bool VisitFunctionDecl(Function function)
6271

6372
private string GetExporting()
6473
{
65-
var exporting = string.Empty;
66-
if (Context.ParserOptions.IsMicrosoftAbi)
67-
exporting = "__declspec(dllexport) ";
68-
else if (TargetTriple.IsMacOS(Context.ParserOptions.TargetTriple))
69-
exporting = "__attribute__((visibility(\"default\"))) ";
70-
return exporting;
74+
return Context.ParserOptions.IsMicrosoftAbi ?
75+
"__declspec(dllexport) " : string.Empty;
7176
}
7277

7378
private string GetWrapper(Module module)

src/Generator/Types/Std/Stdlib.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ public override void CSharpMarshalToNative(CSharpMarshalContext ctx)
137137
ctx.Before.WriteLine($@"{qualifiedBasicString}Extensions.{
138138
assign.Name}({varBasicString}, {ctx.Parameter.Name});");
139139
ctx.Return.Write($"{varBasicString}.{Helpers.InstanceIdentifier}");
140-
if (!type.IsAddress())
140+
if (!type.IsPointer())
141141
ctx.Cleanup.WriteLine($"{varBasicString}.Dispose(false);");
142142
}
143143
}

0 commit comments

Comments
 (0)