diff options
Diffstat (limited to 'src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/AssemblyStubNode.cs')
-rw-r--r-- | src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/AssemblyStubNode.cs | 21 |
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(); |