Browse Source

Add parsing and AST support for RecordArgABI information in class records.

pull/1211/head
Joao Matos 6 years ago committed by João Matos
parent
commit
3eee343554
  1. 22
      src/AST/ClassLayout.cs
  2. 4
      src/CppParser/AST.cpp
  3. 10
      src/CppParser/Bindings/CLI/Decl.cpp
  4. 26
      src/CppParser/Bindings/CLI/Decl.h
  5. 53
      src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/CppSharp.CppParser.cs
  6. 53
      src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/CppSharp.CppParser.cs
  7. 35
      src/CppParser/Bindings/CSharp/x86_64-apple-darwin12.4.0/CppSharp.CppParser.cs
  8. 35
      src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/CppSharp.CppParser.cs
  9. 35
      src/CppParser/Bindings/CSharp/x86_64-linux-gnu/CppSharp.CppParser.cs
  10. 35
      src/CppParser/Bindings/CSharp/x86_64-pc-win32-msvc/CppSharp.CppParser.cs
  11. 16
      src/CppParser/Decl.h
  12. 26
      src/CppParser/Parser.cpp
  13. 16
      src/Parser/ASTConverter.cs

22
src/AST/ClassLayout.cs

@ -73,11 +73,33 @@ namespace CppSharp.AST
public VTableLayout Layout; public VTableLayout Layout;
} }
public enum RecordArgABI
{
/// <summary>
/// <para>Pass it using the normal C aggregate rules for the ABI,</para>
/// <para>potentially introducing extra copies and passing some</para>
/// <para>or all of it in registers.</para>
/// </summary>
Default = 0,
/// <summary>
/// <para>Pass it on the stack using its defined layout.</para>
/// <para>The argument must be evaluated directly into the correct</para>
/// <para>stack position in the arguments area, and the call machinery</para>
/// <para>must not move it or introduce extra copies.</para>
/// </summary>
DirectInMemory = 1,
/// <summary>Pass it as a pointer to temporary memory.</summary>
Indirect = 2
};
// Represents ABI-specific layout details for a class. // Represents ABI-specific layout details for a class.
public class ClassLayout public class ClassLayout
{ {
public CppAbi ABI { get; set; } public CppAbi ABI { get; set; }
/// Provides native argument ABI information.
public RecordArgABI ArgABI { get; set; }
/// Virtual function tables in Microsoft mode. /// Virtual function tables in Microsoft mode.
public List<VFTableInfo> VFTables { get; set; } public List<VFTableInfo> VFTables { get; set; }

4
src/CppParser/AST.cpp

@ -228,8 +228,8 @@ LayoutBase::LayoutBase(const LayoutBase& other) : offset(other.offset), _class(o
LayoutBase::~LayoutBase() {} LayoutBase::~LayoutBase() {}
ClassLayout::ClassLayout() : ABI(CppAbi::Itanium), hasOwnVFPtr(false), ClassLayout::ClassLayout() : ABI(CppAbi::Itanium), argABI(RecordArgABI::Default),
VBPtrOffset(0), alignment(0), size(0), dataSize(0) {} hasOwnVFPtr(false), VBPtrOffset(0), alignment(0), size(0), dataSize(0) {}
DEF_VECTOR(ClassLayout, VFTableInfo, VFTables) DEF_VECTOR(ClassLayout, VFTableInfo, VFTables)

10
src/CppParser/Bindings/CLI/Decl.cpp

@ -2859,6 +2859,16 @@ void CppSharp::Parser::AST::ClassLayout::ABI::set(CppSharp::Parser::AST::CppAbi
((::CppSharp::CppParser::AST::ClassLayout*)NativePtr)->ABI = (::CppSharp::CppParser::AST::CppAbi)value; ((::CppSharp::CppParser::AST::ClassLayout*)NativePtr)->ABI = (::CppSharp::CppParser::AST::CppAbi)value;
} }
CppSharp::Parser::AST::RecordArgABI CppSharp::Parser::AST::ClassLayout::ArgABI::get()
{
return (CppSharp::Parser::AST::RecordArgABI)((::CppSharp::CppParser::AST::ClassLayout*)NativePtr)->argABI;
}
void CppSharp::Parser::AST::ClassLayout::ArgABI::set(CppSharp::Parser::AST::RecordArgABI value)
{
((::CppSharp::CppParser::AST::ClassLayout*)NativePtr)->argABI = (::CppSharp::CppParser::AST::RecordArgABI)value;
}
System::Collections::Generic::List<CppSharp::Parser::AST::VFTableInfo^>^ CppSharp::Parser::AST::ClassLayout::VFTables::get() System::Collections::Generic::List<CppSharp::Parser::AST::VFTableInfo^>^ CppSharp::Parser::AST::ClassLayout::VFTables::get()
{ {
auto _tmp__VFTables = gcnew System::Collections::Generic::List<CppSharp::Parser::AST::VFTableInfo^>(); auto _tmp__VFTables = gcnew System::Collections::Generic::List<CppSharp::Parser::AST::VFTableInfo^>();

26
src/CppParser/Bindings/CLI/Decl.h

@ -24,6 +24,7 @@ namespace CppSharp
enum struct DeclarationKind; enum struct DeclarationKind;
enum struct FriendKind; enum struct FriendKind;
enum struct MacroLocation; enum struct MacroLocation;
enum struct RecordArgABI;
enum struct RefQualifierKind; enum struct RefQualifierKind;
enum struct StatementClassObsolete; enum struct StatementClassObsolete;
enum struct TemplateSpecializationKind; enum struct TemplateSpecializationKind;
@ -246,6 +247,25 @@ namespace CppSharp
iOS64 = 4 iOS64 = 4
}; };
public enum struct RecordArgABI
{
/// <summary>
/// <para>Pass it using the normal C aggregate rules for the ABI,</para>
/// <para>potentially introducing extra copies and passing some</para>
/// <para>or all of it in registers.</para>
/// </summary>
Default = 0,
/// <summary>
/// <para>Pass it on the stack using its defined layout.</para>
/// <para>The argument must be evaluated directly into the correct</para>
/// <para>stack position in the arguments area, and the call machinery</para>
/// <para>must not move it or introduce extra copies.</para>
/// </summary>
DirectInMemory = 1,
/// <summary>Pass it as a pointer to temporary memory.</summary>
Indirect = 2
};
public enum struct VTableComponentKind public enum struct VTableComponentKind
{ {
VCallOffset = 0, VCallOffset = 0,
@ -1539,6 +1559,12 @@ namespace CppSharp
void set(CppSharp::Parser::AST::CppAbi); void set(CppSharp::Parser::AST::CppAbi);
} }
property CppSharp::Parser::AST::RecordArgABI ArgABI
{
CppSharp::Parser::AST::RecordArgABI get();
void set(CppSharp::Parser::AST::RecordArgABI);
}
property System::Collections::Generic::List<CppSharp::Parser::AST::VFTableInfo^>^ VFTables property System::Collections::Generic::List<CppSharp::Parser::AST::VFTableInfo^>^ VFTables
{ {
System::Collections::Generic::List<CppSharp::Parser::AST::VFTableInfo^>^ get(); System::Collections::Generic::List<CppSharp::Parser::AST::VFTableInfo^>^ get();

53
src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/CppSharp.CppParser.cs

@ -6258,6 +6258,25 @@ namespace CppSharp
iOS64 = 4 iOS64 = 4
} }
public enum RecordArgABI
{
/// <summary>
/// <para>Pass it using the normal C aggregate rules for the ABI,</para>
/// <para>potentially introducing extra copies and passing some</para>
/// <para>or all of it in registers.</para>
/// </summary>
Default = 0,
/// <summary>
/// <para>Pass it on the stack using its defined layout.</para>
/// <para>The argument must be evaluated directly into the correct</para>
/// <para>stack position in the arguments area, and the call machinery</para>
/// <para>must not move it or introduce extra copies.</para>
/// </summary>
DirectInMemory = 1,
/// <summary>Pass it as a pointer to temporary memory.</summary>
Indirect = 2
}
public enum VTableComponentKind public enum VTableComponentKind
{ {
VCallOffset = 0, VCallOffset = 0,
@ -12138,37 +12157,40 @@ namespace CppSharp
public unsafe partial class ClassLayout : IDisposable public unsafe partial class ClassLayout : IDisposable
{ {
[StructLayout(LayoutKind.Explicit, Size = 72)] [StructLayout(LayoutKind.Explicit, Size = 76)]
public partial struct __Internal public partial struct __Internal
{ {
[FieldOffset(0)] [FieldOffset(0)]
internal global::CppSharp.Parser.AST.CppAbi ABI; internal global::CppSharp.Parser.AST.CppAbi ABI;
[FieldOffset(4)] [FieldOffset(4)]
internal global::CppSharp.Parser.AST.RecordArgABI argABI;
[FieldOffset(8)]
internal global::Std.Vector.__Internalc__N_std_N___1_S_vector____N_CppSharp_N_CppParser_N_AST_S_VFTableInfo___N_std_N___1_S_allocator__S0_ VFTables; internal global::Std.Vector.__Internalc__N_std_N___1_S_vector____N_CppSharp_N_CppParser_N_AST_S_VFTableInfo___N_std_N___1_S_allocator__S0_ VFTables;
[FieldOffset(16)] [FieldOffset(20)]
internal global::CppSharp.Parser.AST.VTableLayout.__Internal layout; internal global::CppSharp.Parser.AST.VTableLayout.__Internal layout;
[FieldOffset(28)] [FieldOffset(32)]
internal byte hasOwnVFPtr; internal byte hasOwnVFPtr;
[FieldOffset(32)] [FieldOffset(36)]
internal int VBPtrOffset; internal int VBPtrOffset;
[FieldOffset(36)] [FieldOffset(40)]
internal int alignment; internal int alignment;
[FieldOffset(40)] [FieldOffset(44)]
internal int size; internal int size;
[FieldOffset(44)] [FieldOffset(48)]
internal int dataSize; internal int dataSize;
[FieldOffset(48)] [FieldOffset(52)]
internal global::Std.Vector.__Internalc__N_std_N___1_S_vector____N_CppSharp_N_CppParser_N_AST_S_LayoutField___N_std_N___1_S_allocator__S0_ Fields; internal global::Std.Vector.__Internalc__N_std_N___1_S_vector____N_CppSharp_N_CppParser_N_AST_S_LayoutField___N_std_N___1_S_allocator__S0_ Fields;
[FieldOffset(60)] [FieldOffset(64)]
internal global::Std.Vector.__Internalc__N_std_N___1_S_vector____N_CppSharp_N_CppParser_N_AST_S_LayoutBase___N_std_N___1_S_allocator__S0_ Bases; internal global::Std.Vector.__Internalc__N_std_N___1_S_vector____N_CppSharp_N_CppParser_N_AST_S_LayoutBase___N_std_N___1_S_allocator__S0_ Bases;
[SuppressUnmanagedCodeSecurity] [SuppressUnmanagedCodeSecurity]
@ -12396,6 +12418,19 @@ namespace CppSharp
} }
} }
public global::CppSharp.Parser.AST.RecordArgABI ArgABI
{
get
{
return ((global::CppSharp.Parser.AST.ClassLayout.__Internal*) __Instance)->argABI;
}
set
{
((global::CppSharp.Parser.AST.ClassLayout.__Internal*)__Instance)->argABI = value;
}
}
public global::CppSharp.Parser.AST.VTableLayout Layout public global::CppSharp.Parser.AST.VTableLayout Layout
{ {
get get

53
src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/CppSharp.CppParser.cs

@ -6258,6 +6258,25 @@ namespace CppSharp
iOS64 = 4 iOS64 = 4
} }
public enum RecordArgABI
{
/// <summary>
/// <para>Pass it using the normal C aggregate rules for the ABI,</para>
/// <para>potentially introducing extra copies and passing some</para>
/// <para>or all of it in registers.</para>
/// </summary>
Default = 0,
/// <summary>
/// <para>Pass it on the stack using its defined layout.</para>
/// <para>The argument must be evaluated directly into the correct</para>
/// <para>stack position in the arguments area, and the call machinery</para>
/// <para>must not move it or introduce extra copies.</para>
/// </summary>
DirectInMemory = 1,
/// <summary>Pass it as a pointer to temporary memory.</summary>
Indirect = 2
}
public enum VTableComponentKind public enum VTableComponentKind
{ {
VCallOffset = 0, VCallOffset = 0,
@ -12138,37 +12157,40 @@ namespace CppSharp
public unsafe partial class ClassLayout : IDisposable public unsafe partial class ClassLayout : IDisposable
{ {
[StructLayout(LayoutKind.Explicit, Size = 72)] [StructLayout(LayoutKind.Explicit, Size = 76)]
public partial struct __Internal public partial struct __Internal
{ {
[FieldOffset(0)] [FieldOffset(0)]
internal global::CppSharp.Parser.AST.CppAbi ABI; internal global::CppSharp.Parser.AST.CppAbi ABI;
[FieldOffset(4)] [FieldOffset(4)]
internal global::CppSharp.Parser.AST.RecordArgABI argABI;
[FieldOffset(8)]
internal global::Std.Vector.__Internalc__N_std_S_vector____N_CppSharp_N_CppParser_N_AST_S_VFTableInfo___N_std_S_allocator__S0_ VFTables; internal global::Std.Vector.__Internalc__N_std_S_vector____N_CppSharp_N_CppParser_N_AST_S_VFTableInfo___N_std_S_allocator__S0_ VFTables;
[FieldOffset(16)] [FieldOffset(20)]
internal global::CppSharp.Parser.AST.VTableLayout.__Internal layout; internal global::CppSharp.Parser.AST.VTableLayout.__Internal layout;
[FieldOffset(28)] [FieldOffset(32)]
internal byte hasOwnVFPtr; internal byte hasOwnVFPtr;
[FieldOffset(32)] [FieldOffset(36)]
internal int VBPtrOffset; internal int VBPtrOffset;
[FieldOffset(36)] [FieldOffset(40)]
internal int alignment; internal int alignment;
[FieldOffset(40)] [FieldOffset(44)]
internal int size; internal int size;
[FieldOffset(44)] [FieldOffset(48)]
internal int dataSize; internal int dataSize;
[FieldOffset(48)] [FieldOffset(52)]
internal global::Std.Vector.__Internalc__N_std_S_vector____N_CppSharp_N_CppParser_N_AST_S_LayoutField___N_std_S_allocator__S0_ Fields; internal global::Std.Vector.__Internalc__N_std_S_vector____N_CppSharp_N_CppParser_N_AST_S_LayoutField___N_std_S_allocator__S0_ Fields;
[FieldOffset(60)] [FieldOffset(64)]
internal global::Std.Vector.__Internalc__N_std_S_vector____N_CppSharp_N_CppParser_N_AST_S_LayoutBase___N_std_S_allocator__S0_ Bases; internal global::Std.Vector.__Internalc__N_std_S_vector____N_CppSharp_N_CppParser_N_AST_S_LayoutBase___N_std_S_allocator__S0_ Bases;
[SuppressUnmanagedCodeSecurity] [SuppressUnmanagedCodeSecurity]
@ -12396,6 +12418,19 @@ namespace CppSharp
} }
} }
public global::CppSharp.Parser.AST.RecordArgABI ArgABI
{
get
{
return ((global::CppSharp.Parser.AST.ClassLayout.__Internal*) __Instance)->argABI;
}
set
{
((global::CppSharp.Parser.AST.ClassLayout.__Internal*)__Instance)->argABI = value;
}
}
public global::CppSharp.Parser.AST.VTableLayout Layout public global::CppSharp.Parser.AST.VTableLayout Layout
{ {
get get

35
src/CppParser/Bindings/CSharp/x86_64-apple-darwin12.4.0/CppSharp.CppParser.cs

@ -6258,6 +6258,25 @@ namespace CppSharp
iOS64 = 4 iOS64 = 4
} }
public enum RecordArgABI
{
/// <summary>
/// <para>Pass it using the normal C aggregate rules for the ABI,</para>
/// <para>potentially introducing extra copies and passing some</para>
/// <para>or all of it in registers.</para>
/// </summary>
Default = 0,
/// <summary>
/// <para>Pass it on the stack using its defined layout.</para>
/// <para>The argument must be evaluated directly into the correct</para>
/// <para>stack position in the arguments area, and the call machinery</para>
/// <para>must not move it or introduce extra copies.</para>
/// </summary>
DirectInMemory = 1,
/// <summary>Pass it as a pointer to temporary memory.</summary>
Indirect = 2
}
public enum VTableComponentKind public enum VTableComponentKind
{ {
VCallOffset = 0, VCallOffset = 0,
@ -12143,6 +12162,9 @@ namespace CppSharp
[FieldOffset(0)] [FieldOffset(0)]
internal global::CppSharp.Parser.AST.CppAbi ABI; internal global::CppSharp.Parser.AST.CppAbi ABI;
[FieldOffset(4)]
internal global::CppSharp.Parser.AST.RecordArgABI argABI;
[FieldOffset(8)] [FieldOffset(8)]
internal global::Std.Vector.__Internalc__N_std_N___1_S_vector____N_CppSharp_N_CppParser_N_AST_S_VFTableInfo___N_std_N___1_S_allocator__S0_ VFTables; internal global::Std.Vector.__Internalc__N_std_N___1_S_vector____N_CppSharp_N_CppParser_N_AST_S_VFTableInfo___N_std_N___1_S_allocator__S0_ VFTables;
@ -12395,6 +12417,19 @@ namespace CppSharp
} }
} }
public global::CppSharp.Parser.AST.RecordArgABI ArgABI
{
get
{
return ((global::CppSharp.Parser.AST.ClassLayout.__Internal*) __Instance)->argABI;
}
set
{
((global::CppSharp.Parser.AST.ClassLayout.__Internal*)__Instance)->argABI = value;
}
}
public global::CppSharp.Parser.AST.VTableLayout Layout public global::CppSharp.Parser.AST.VTableLayout Layout
{ {
get get

35
src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/CppSharp.CppParser.cs

@ -6258,6 +6258,25 @@ namespace CppSharp
iOS64 = 4 iOS64 = 4
} }
public enum RecordArgABI
{
/// <summary>
/// <para>Pass it using the normal C aggregate rules for the ABI,</para>
/// <para>potentially introducing extra copies and passing some</para>
/// <para>or all of it in registers.</para>
/// </summary>
Default = 0,
/// <summary>
/// <para>Pass it on the stack using its defined layout.</para>
/// <para>The argument must be evaluated directly into the correct</para>
/// <para>stack position in the arguments area, and the call machinery</para>
/// <para>must not move it or introduce extra copies.</para>
/// </summary>
DirectInMemory = 1,
/// <summary>Pass it as a pointer to temporary memory.</summary>
Indirect = 2
}
public enum VTableComponentKind public enum VTableComponentKind
{ {
VCallOffset = 0, VCallOffset = 0,
@ -12143,6 +12162,9 @@ namespace CppSharp
[FieldOffset(0)] [FieldOffset(0)]
internal global::CppSharp.Parser.AST.CppAbi ABI; internal global::CppSharp.Parser.AST.CppAbi ABI;
[FieldOffset(4)]
internal global::CppSharp.Parser.AST.RecordArgABI argABI;
[FieldOffset(8)] [FieldOffset(8)]
internal global::Std.Vector.__Internalc__N_std_S_vector____N_CppSharp_N_CppParser_N_AST_S_VFTableInfo___N_std_S_allocator__S0_ VFTables; internal global::Std.Vector.__Internalc__N_std_S_vector____N_CppSharp_N_CppParser_N_AST_S_VFTableInfo___N_std_S_allocator__S0_ VFTables;
@ -12395,6 +12417,19 @@ namespace CppSharp
} }
} }
public global::CppSharp.Parser.AST.RecordArgABI ArgABI
{
get
{
return ((global::CppSharp.Parser.AST.ClassLayout.__Internal*) __Instance)->argABI;
}
set
{
((global::CppSharp.Parser.AST.ClassLayout.__Internal*)__Instance)->argABI = value;
}
}
public global::CppSharp.Parser.AST.VTableLayout Layout public global::CppSharp.Parser.AST.VTableLayout Layout
{ {
get get

35
src/CppParser/Bindings/CSharp/x86_64-linux-gnu/CppSharp.CppParser.cs

@ -6258,6 +6258,25 @@ namespace CppSharp
iOS64 = 4 iOS64 = 4
} }
public enum RecordArgABI
{
/// <summary>
/// <para>Pass it using the normal C aggregate rules for the ABI,</para>
/// <para>potentially introducing extra copies and passing some</para>
/// <para>or all of it in registers.</para>
/// </summary>
Default = 0,
/// <summary>
/// <para>Pass it on the stack using its defined layout.</para>
/// <para>The argument must be evaluated directly into the correct</para>
/// <para>stack position in the arguments area, and the call machinery</para>
/// <para>must not move it or introduce extra copies.</para>
/// </summary>
DirectInMemory = 1,
/// <summary>Pass it as a pointer to temporary memory.</summary>
Indirect = 2
}
public enum VTableComponentKind public enum VTableComponentKind
{ {
VCallOffset = 0, VCallOffset = 0,
@ -12143,6 +12162,9 @@ namespace CppSharp
[FieldOffset(0)] [FieldOffset(0)]
internal global::CppSharp.Parser.AST.CppAbi ABI; internal global::CppSharp.Parser.AST.CppAbi ABI;
[FieldOffset(4)]
internal global::CppSharp.Parser.AST.RecordArgABI argABI;
[FieldOffset(8)] [FieldOffset(8)]
internal global::Std.Vector.__Internalc__N_std_S_vector____N_CppSharp_N_CppParser_N_AST_S_VFTableInfo___N_std_S_allocator__S0_ VFTables; internal global::Std.Vector.__Internalc__N_std_S_vector____N_CppSharp_N_CppParser_N_AST_S_VFTableInfo___N_std_S_allocator__S0_ VFTables;
@ -12395,6 +12417,19 @@ namespace CppSharp
} }
} }
public global::CppSharp.Parser.AST.RecordArgABI ArgABI
{
get
{
return ((global::CppSharp.Parser.AST.ClassLayout.__Internal*) __Instance)->argABI;
}
set
{
((global::CppSharp.Parser.AST.ClassLayout.__Internal*)__Instance)->argABI = value;
}
}
public global::CppSharp.Parser.AST.VTableLayout Layout public global::CppSharp.Parser.AST.VTableLayout Layout
{ {
get get

35
src/CppParser/Bindings/CSharp/x86_64-pc-win32-msvc/CppSharp.CppParser.cs

@ -6258,6 +6258,25 @@ namespace CppSharp
iOS64 = 4 iOS64 = 4
} }
public enum RecordArgABI
{
/// <summary>
/// <para>Pass it using the normal C aggregate rules for the ABI,</para>
/// <para>potentially introducing extra copies and passing some</para>
/// <para>or all of it in registers.</para>
/// </summary>
Default = 0,
/// <summary>
/// <para>Pass it on the stack using its defined layout.</para>
/// <para>The argument must be evaluated directly into the correct</para>
/// <para>stack position in the arguments area, and the call machinery</para>
/// <para>must not move it or introduce extra copies.</para>
/// </summary>
DirectInMemory = 1,
/// <summary>Pass it as a pointer to temporary memory.</summary>
Indirect = 2
}
public enum VTableComponentKind public enum VTableComponentKind
{ {
VCallOffset = 0, VCallOffset = 0,
@ -12144,6 +12163,9 @@ namespace CppSharp
[FieldOffset(0)] [FieldOffset(0)]
internal global::CppSharp.Parser.AST.CppAbi ABI; internal global::CppSharp.Parser.AST.CppAbi ABI;
[FieldOffset(4)]
internal global::CppSharp.Parser.AST.RecordArgABI argABI;
[FieldOffset(8)] [FieldOffset(8)]
internal global::Std.Vector.__Internalc__N_std_S_vector____N_CppSharp_N_CppParser_N_AST_S_VFTableInfo___N_std_S_allocator__S0_ VFTables; internal global::Std.Vector.__Internalc__N_std_S_vector____N_CppSharp_N_CppParser_N_AST_S_VFTableInfo___N_std_S_allocator__S0_ VFTables;
@ -12396,6 +12418,19 @@ namespace CppSharp
} }
} }
public global::CppSharp.Parser.AST.RecordArgABI ArgABI
{
get
{
return ((global::CppSharp.Parser.AST.ClassLayout.__Internal*) __Instance)->argABI;
}
set
{
((global::CppSharp.Parser.AST.ClassLayout.__Internal*)__Instance)->argABI = value;
}
}
public global::CppSharp.Parser.AST.VTableLayout Layout public global::CppSharp.Parser.AST.VTableLayout Layout
{ {
get get

16
src/CppParser/Decl.h

@ -524,10 +524,26 @@ public:
Class* _class; Class* _class;
}; };
enum class RecordArgABI
{
/// Pass it using the normal C aggregate rules for the ABI,
/// potentially introducing extra copies and passing some
/// or all of it in registers.
Default = 0,
/// Pass it on the stack using its defined layout.
/// The argument must be evaluated directly into the correct
/// stack position in the arguments area, and the call machinery
/// must not move it or introduce extra copies.
DirectInMemory,
/// Pass it as a pointer to temporary memory.
Indirect
};
struct CS_API ClassLayout struct CS_API ClassLayout
{ {
ClassLayout(); ClassLayout();
CppAbi ABI; CppAbi ABI;
RecordArgABI argABI;
VECTOR(VFTableInfo, VFTables) VECTOR(VFTableInfo, VFTables)
VTableLayout layout; VTableLayout layout;
bool hasOwnVFPtr; bool hasOwnVFPtr;

26
src/CppParser/Parser.cpp

@ -941,6 +941,21 @@ bool Parser::IsSupported(const clang::CXXMethodDecl* MD)
supportedStdTypes.end()); supportedStdTypes.end());
} }
static RecordArgABI GetRecordArgABI(
clang::CodeGen::CGCXXABI::RecordArgABI argAbi)
{
using namespace clang::CodeGen;
switch (argAbi)
{
case CGCXXABI::RecordArgABI::RAA_Default:
return RecordArgABI::Default;
case CGCXXABI::RecordArgABI::RAA_DirectInMemory:
return RecordArgABI::DirectInMemory;
case CGCXXABI::RecordArgABI::RAA_Indirect:
return RecordArgABI::Indirect;
}
}
void Parser::WalkRecord(const clang::RecordDecl* Record, Class* RC) void Parser::WalkRecord(const clang::RecordDecl* Record, Class* RC)
{ {
using namespace clang; using namespace clang;
@ -971,14 +986,23 @@ void Parser::WalkRecord(const clang::RecordDecl* Record, Class* RC)
if (hasLayout) if (hasLayout)
{ {
const auto& Layout = c->getASTContext().getASTRecordLayout(Record);
if (!RC->layout) if (!RC->layout)
RC->layout = new ClassLayout(); RC->layout = new ClassLayout();
auto targetABI = c->getTarget().getCXXABI().getKind(); auto targetABI = c->getTarget().getCXXABI().getKind();
RC->layout->ABI = GetClassLayoutAbi(targetABI); RC->layout->ABI = GetClassLayoutAbi(targetABI);
if (auto CXXRD = llvm::dyn_cast_or_null<clang::CXXRecordDecl>(Record))
{
auto& CXXABI = codeGenTypes->getCXXABI();
RC->layout->argABI = GetRecordArgABI(CXXABI.getRecordArgABI(CXXRD));
}
const auto& Layout = c->getASTContext().getASTRecordLayout(Record);
RC->layout->alignment = (int)Layout.getAlignment().getQuantity(); RC->layout->alignment = (int)Layout.getAlignment().getQuantity();
RC->layout->size = (int)Layout.getSize().getQuantity(); RC->layout->size = (int)Layout.getSize().getQuantity();
RC->layout->dataSize = (int)Layout.getDataSize().getQuantity(); RC->layout->dataSize = (int)Layout.getDataSize().getQuantity();
ReadClassLayout(RC, Record, CharUnits(), true); ReadClassLayout(RC, Record, CharUnits(), true);
} }

16
src/Parser/ASTConverter.cs

@ -1577,11 +1577,27 @@ namespace CppSharp
return _class; return _class;
} }
AST.RecordArgABI VisitRecordArgABI(RecordArgABI argAbi)
{
switch (argAbi)
{
case RecordArgABI.Default:
return AST.RecordArgABI.Default;
case RecordArgABI.DirectInMemory:
return AST.RecordArgABI.DirectInMemory;
case RecordArgABI.Indirect:
return AST.RecordArgABI.Indirect;
}
throw new NotImplementedException();
}
AST.ClassLayout VisitClassLayout(ClassLayout layout) AST.ClassLayout VisitClassLayout(ClassLayout layout)
{ {
var _layout = new AST.ClassLayout var _layout = new AST.ClassLayout
{ {
ABI = VisitCppAbi(layout.ABI), ABI = VisitCppAbi(layout.ABI),
ArgABI = VisitRecordArgABI(layout.ArgABI),
Layout = VisitVTableLayout(layout.Layout), Layout = VisitVTableLayout(layout.Layout),
HasOwnVFPtr = layout.HasOwnVFPtr, HasOwnVFPtr = layout.HasOwnVFPtr,
VBPtrOffset = layout.VBPtrOffset, VBPtrOffset = layout.VBPtrOffset,

Loading…
Cancel
Save