Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/corert.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/AssemblyStubNode.cs')
-rw-r--r--src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/AssemblyStubNode.cs21
1 files changed, 17 insertions, 4 deletions
diff --git a/src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/AssemblyStubNode.cs b/src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/AssemblyStubNode.cs
index db568a3e8..0bc9db8c6 100644
--- a/src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/AssemblyStubNode.cs
+++ b/src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/AssemblyStubNode.cs
@@ -16,6 +16,12 @@ namespace ILCompiler.DependencyAnalysis
{
}
+ /// <summary>
+ /// Gets a value indicating whether the stub's address is visible from managed code
+ /// and could be a target of a managed calli.
+ /// </summary>
+ protected virtual bool IsVisibleFromManagedCode => true;
+
public override ObjectNodeSection Section => ObjectNodeSection.TextSection;
public override bool StaticDependenciesAreComputed => true;
@@ -26,19 +32,26 @@ namespace ILCompiler.DependencyAnalysis
public override ObjectData GetData(NodeFactory factory, bool relocsOnly)
{
+ // If the address is expected to be visible from managed code, we need to align
+ // at the managed code boundaries to prevent the stub from being confused with
+ // a fat fuction pointer. Otherwise we can align tighter.
+ int alignment = IsVisibleFromManagedCode ?
+ factory.Target.MinimumFunctionAlignment :
+ factory.Target.MinimumCodeAlignment;
+
switch (factory.Target.Architecture)
{
case TargetArchitecture.X64:
X64.X64Emitter x64Emitter = new X64.X64Emitter(factory, relocsOnly);
EmitCode(factory, ref x64Emitter, relocsOnly);
- x64Emitter.Builder.RequireInitialAlignment(factory.Target.MinimumFunctionAlignment);
+ x64Emitter.Builder.RequireInitialAlignment(alignment);
x64Emitter.Builder.AddSymbol(this);
return x64Emitter.Builder.ToObjectData();
case TargetArchitecture.X86:
X86.X86Emitter x86Emitter = new X86.X86Emitter(factory, relocsOnly);
EmitCode(factory, ref x86Emitter, relocsOnly);
- x86Emitter.Builder.RequireInitialAlignment(factory.Target.MinimumFunctionAlignment);
+ x86Emitter.Builder.RequireInitialAlignment(alignment);
x86Emitter.Builder.AddSymbol(this);
return x86Emitter.Builder.ToObjectData();
@@ -46,14 +59,14 @@ namespace ILCompiler.DependencyAnalysis
case TargetArchitecture.ARMEL:
ARM.ARMEmitter armEmitter = new ARM.ARMEmitter(factory, relocsOnly);
EmitCode(factory, ref armEmitter, relocsOnly);
- armEmitter.Builder.RequireInitialAlignment(factory.Target.MinimumFunctionAlignment);
+ armEmitter.Builder.RequireInitialAlignment(alignment);
armEmitter.Builder.AddSymbol(this);
return armEmitter.Builder.ToObjectData();
case TargetArchitecture.ARM64:
ARM64.ARM64Emitter arm64Emitter = new ARM64.ARM64Emitter(factory, relocsOnly);
EmitCode(factory, ref arm64Emitter, relocsOnly);
- arm64Emitter.Builder.RequireInitialAlignment(factory.Target.MinimumFunctionAlignment);
+ arm64Emitter.Builder.RequireInitialAlignment(alignment);
arm64Emitter.Builder.AddSymbol(this);
return arm64Emitter.Builder.ToObjectData();