mirror of https://github.com/mono/CppSharp.git
2 changed files with 63 additions and 0 deletions
@ -0,0 +1,60 @@ |
|||||||
|
namespace Cxxi.Passes |
||||||
|
{ |
||||||
|
public class CheckAbiParameters : TranslationUnitPass |
||||||
|
{ |
||||||
|
private readonly DriverOptions options; |
||||||
|
|
||||||
|
public CheckAbiParameters(DriverOptions options) |
||||||
|
{ |
||||||
|
this.options = options; |
||||||
|
} |
||||||
|
|
||||||
|
public override bool VisitMethodDecl(Method method) |
||||||
|
{ |
||||||
|
if (!NeedsHiddenStructParameterReturn(method, options)) |
||||||
|
return true; |
||||||
|
|
||||||
|
var structParameter = new Parameter() |
||||||
|
{ |
||||||
|
Kind = ParameterKind.HiddenStructureReturn, |
||||||
|
QualifiedType = new QualifiedType( |
||||||
|
new BuiltinType(PrimitiveType.IntPtr)), |
||||||
|
Name = "return", |
||||||
|
IgnoreFlags = IgnoreFlags.Generation |
||||||
|
}; |
||||||
|
|
||||||
|
method.Parameters.Insert(0, structParameter); |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
public static bool NeedsHiddenStructParameterReturn(Method method, DriverOptions options) |
||||||
|
{ |
||||||
|
// In both the Microsoft and Itanium ABI, functions returning
|
||||||
|
// structure types by value have an extra parameter
|
||||||
|
// Itanium ABI reference (3.1.4 Return values):
|
||||||
|
// http://refspecs.linux-foundation.org/cxxabi-1.83.html#calls
|
||||||
|
// Microsoft ABI reference:
|
||||||
|
// http://blog.aaronballman.com/2012/02/describing-the-msvc-abi-for-structure-return-types/
|
||||||
|
|
||||||
|
Class retClass; |
||||||
|
if (!method.ReturnType.IsTagDecl(out retClass)) |
||||||
|
return false; |
||||||
|
|
||||||
|
// TODO: Add the various combinations for that need hidden parameter
|
||||||
|
var needsMSHiddenPtr = options.IsMicrosoftAbi && method.IsThisCall; |
||||||
|
|
||||||
|
return needsMSHiddenPtr || options.IsItaniumAbi; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static class CheckAbiParametersExtensions |
||||||
|
{ |
||||||
|
public static void CheckAbiParameters(this PassBuilder builder, |
||||||
|
DriverOptions options) |
||||||
|
{ |
||||||
|
var pass = new CheckAbiParameters(options); |
||||||
|
builder.AddPass(pass); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue