You've already forked linux-packaging-mono
Imported Upstream version 5.0.0.42
Former-commit-id: fd56571888259555122d8a0f58c68838229cea2b
This commit is contained in:
parent
1190d13a04
commit
6bdd276d05
3
external/linker/.gitmodules
vendored
Normal file
3
external/linker/.gitmodules
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
[submodule "cecil"]
|
||||
path = cecil
|
||||
url = git://github.com/mono/cecil.git
|
73
external/linker/Contributing.md
vendored
Normal file
73
external/linker/Contributing.md
vendored
Normal file
@@ -0,0 +1,73 @@
|
||||
Guidelines
|
||||
==========
|
||||
|
||||
When contributing to the Mono project, please follow the [Mono Coding
|
||||
Guidelines][1]. We have been using a coding style for many years,
|
||||
please make your patches conform to these guidelines.
|
||||
|
||||
[1]: http://www.mono-project.com/community/contributing/coding-guidelines/
|
||||
|
||||
Etiquette
|
||||
=========
|
||||
|
||||
In general, we do not accept patches that merely shuffle code around,
|
||||
split classes in multiple files, reindent the code or are the result
|
||||
of running a refactoring tool on the source code. This is done for
|
||||
three reasons: (a) we have our own coding guidelines; (b) Some modules
|
||||
are imported from upstream sources and we want to respect their coding
|
||||
guidelines and (c) it destroys valuable history that is often used to
|
||||
investigate bugs, regressions and problems.
|
||||
|
||||
License
|
||||
=======
|
||||
|
||||
The Mono runtime, compilers, and tools and most of the class libraries
|
||||
are licensed under the MIT license. But include some bits of code
|
||||
licensed under different licenses. The exact list is [available here] (https://github.com/mono/mono/blob/master/LICENSE).
|
||||
|
||||
Different parts of Mono use different licenses. The actual details of
|
||||
which licenses are used for which parts are detailed on the LICENSE
|
||||
file in this directory.
|
||||
|
||||
CLA
|
||||
=======
|
||||
|
||||
Contributions are now taken under the [.NET Foundation CLA] (https://cla2.dotnetfoundation.org/).
|
||||
|
||||
Testing
|
||||
=======
|
||||
|
||||
Pull requests go through testing on our [Jenkins server][2]. We will
|
||||
usually only merge a pull request if it causes no regressions in a
|
||||
test run there.
|
||||
|
||||
When you submit a pull request, one of two things happens:
|
||||
|
||||
* If you are a new contributor, Jenkins will ask for permissions (on
|
||||
the pull request) to test it. A maintainer will reply to approve
|
||||
the test run if they find the patch appropriate. After you have
|
||||
submitted a few patches, a maintainer will whitelist you so that
|
||||
all of your future pull requests are tested automatically.
|
||||
* If you are a well-known, whitelisted contributor, Jenkins will go
|
||||
ahead and test your pull request as soon as a test machine is
|
||||
available.
|
||||
|
||||
When your pull request has been built, Jenkins will update the build
|
||||
status of your pull request. If it succeeded and we like the changes,
|
||||
a maintainer will likely merge it. Otherwise, you can amend your pull
|
||||
request to fix build breakage and Jenkins will test it again.
|
||||
|
||||
[2]: http://jenkins.mono-project.com/
|
||||
|
||||
# Inactivity
|
||||
|
||||
Occasionally, a pull request sits for several months without any
|
||||
response from the author. This isn't necessarily an issue, but we may
|
||||
sometimes decide to close pull requests that have not seen any
|
||||
progress for a long time. This is in interest of keeping the pull
|
||||
request list clean so that other pull requests don't get lost in the
|
||||
clutter.
|
||||
|
||||
If we do close your pull request due to inactivity, you're more than
|
||||
welcome to submit it anew after you address any comments or issues that
|
||||
were brought up on the original pull request.
|
19
external/linker/LICENSE
vendored
Normal file
19
external/linker/LICENSE
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
44
external/linker/PATENTS.TXT
vendored
Normal file
44
external/linker/PATENTS.TXT
vendored
Normal file
@@ -0,0 +1,44 @@
|
||||
Microsoft Patent Promise for Mono
|
||||
|
||||
Microsoft Corporation and its affiliates (“Microsoft”) promise not to
|
||||
assert any Applicable Patents against you for making, using, selling,
|
||||
offering for sale, importing, or distributing Mono.
|
||||
|
||||
If you file, maintain, or voluntarily participate in any claim in a
|
||||
lawsuit alleging direct or contributory patent infringement by Mono,
|
||||
or inducement of patent infringement by Mono, then your rights under
|
||||
this promise will automatically terminate.
|
||||
|
||||
This promise is not an assurance that (i) any Applicable Patents are
|
||||
valid or enforceable or (ii) Mono does not infringe patents or other
|
||||
intellectual property rights of any third party. No rights except
|
||||
those expressly stated in this promise are granted, waived or received
|
||||
by Microsoft, whether by implication, exhaustion, estoppel or
|
||||
otherwise. This is a personal promise directly from Microsoft to you,
|
||||
and you agree as a condition of benefitting from it that no Microsoft
|
||||
rights are received from suppliers, distributors, or otherwise in
|
||||
connection with this promise.
|
||||
|
||||
Definitions:
|
||||
|
||||
“Mono” means those portions of the software development technology, as
|
||||
originally distributed by Xamarin, Inc. or the .NET Foundation under
|
||||
the name “Mono,” that implement .NET Framework Functionality, provided
|
||||
that such portions at a minimum implement all of the required parts of
|
||||
the mandatory provisions of Standard ECMA-335 – Common Language
|
||||
Infrastructure (CLI).
|
||||
|
||||
“.NET Framework Functionality” means any functionality in Microsoft’s
|
||||
.NET Framework as described in Microsoft’s API documentation on
|
||||
Microsoft’s MSDN website, including the functionality in
|
||||
Windowsbase.dll, but excluding all other functionality in the Windows
|
||||
Presentation Foundation component of .NET Framework.
|
||||
|
||||
“Applicable Patents” are those patent claims, currently owned by
|
||||
Microsoft and acquired in the future, that are necessarily infringed
|
||||
by Mono. For clarity, Applicable Patents do not include any patent
|
||||
claims that are infringed (x) by any underlying or enabling technology
|
||||
that may be used, combined, or distributed in connection with Mono
|
||||
(such as hardware, operating systems, or applications that run on
|
||||
Mono), (y) only as a consequence of modification of Mono, or (z) only
|
||||
by the combination of Mono with third party code.
|
8
external/linker/README.md
vendored
Normal file
8
external/linker/README.md
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
The Mono linker is a tool one can use to only ship the minimal possible set of functions that a set of
|
||||
programs might require to run as opposed to the full libraries.
|
||||
|
||||
It is used by the various Xamarin products to extract only the bits of code that are needed to run
|
||||
an application on Android, iOS and other platforms.
|
||||
|
||||
This file was extracted from Mono (github.com/mono/mono) on November 1st, 2016 to allow easier
|
||||
sharing of the linker code with other .NET projects.
|
8
external/linker/cecil/.gitattributes
vendored
Normal file
8
external/linker/cecil/.gitattributes
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
* text=auto
|
||||
|
||||
.md text
|
||||
.cs text
|
||||
|
||||
.sln text=crlf
|
||||
.*proj text=crlf
|
||||
.settings text=crlf
|
15
external/linker/cecil/.gitignore
vendored
Normal file
15
external/linker/cecil/.gitignore
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
bin
|
||||
obj
|
||||
*.suo
|
||||
*.iml
|
||||
*.user
|
||||
*.pidb
|
||||
*.userprefs
|
||||
*.xml
|
||||
*.nupkg
|
||||
**/test-results/*
|
||||
*Resharper*
|
||||
Mono.Cecil.sln.ide*
|
||||
TestResults
|
||||
project.lock.json
|
||||
.vs/
|
8
external/linker/cecil/.travis.yml
vendored
Normal file
8
external/linker/cecil/.travis.yml
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
language: csharp
|
||||
solution: Mono.Cecil.sln
|
||||
install:
|
||||
- nuget restore Mono.Cecil.sln
|
||||
- nuget install NUnit.Runners -Version 2.6.4 -OutputDirectory testrunner
|
||||
script:
|
||||
- xbuild /p:Configuration=net_4_0_Debug Mono.Cecil.sln
|
||||
- mono ./testrunner/NUnit.Runners.2.6.4/tools/nunit-console.exe Mono.Cecil.nunit
|
21
external/linker/cecil/LICENSE.txt
vendored
Normal file
21
external/linker/cecil/LICENSE.txt
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
Copyright (c) 2008 - 2015 Jb Evain
|
||||
Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
234
external/linker/cecil/Mono.Cecil.Cil/Code.cs
vendored
Normal file
234
external/linker/cecil/Mono.Cecil.Cil/Code.cs
vendored
Normal file
@@ -0,0 +1,234 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
namespace Mono.Cecil.Cil {
|
||||
|
||||
public enum Code {
|
||||
Nop,
|
||||
Break,
|
||||
Ldarg_0,
|
||||
Ldarg_1,
|
||||
Ldarg_2,
|
||||
Ldarg_3,
|
||||
Ldloc_0,
|
||||
Ldloc_1,
|
||||
Ldloc_2,
|
||||
Ldloc_3,
|
||||
Stloc_0,
|
||||
Stloc_1,
|
||||
Stloc_2,
|
||||
Stloc_3,
|
||||
Ldarg_S,
|
||||
Ldarga_S,
|
||||
Starg_S,
|
||||
Ldloc_S,
|
||||
Ldloca_S,
|
||||
Stloc_S,
|
||||
Ldnull,
|
||||
Ldc_I4_M1,
|
||||
Ldc_I4_0,
|
||||
Ldc_I4_1,
|
||||
Ldc_I4_2,
|
||||
Ldc_I4_3,
|
||||
Ldc_I4_4,
|
||||
Ldc_I4_5,
|
||||
Ldc_I4_6,
|
||||
Ldc_I4_7,
|
||||
Ldc_I4_8,
|
||||
Ldc_I4_S,
|
||||
Ldc_I4,
|
||||
Ldc_I8,
|
||||
Ldc_R4,
|
||||
Ldc_R8,
|
||||
Dup,
|
||||
Pop,
|
||||
Jmp,
|
||||
Call,
|
||||
Calli,
|
||||
Ret,
|
||||
Br_S,
|
||||
Brfalse_S,
|
||||
Brtrue_S,
|
||||
Beq_S,
|
||||
Bge_S,
|
||||
Bgt_S,
|
||||
Ble_S,
|
||||
Blt_S,
|
||||
Bne_Un_S,
|
||||
Bge_Un_S,
|
||||
Bgt_Un_S,
|
||||
Ble_Un_S,
|
||||
Blt_Un_S,
|
||||
Br,
|
||||
Brfalse,
|
||||
Brtrue,
|
||||
Beq,
|
||||
Bge,
|
||||
Bgt,
|
||||
Ble,
|
||||
Blt,
|
||||
Bne_Un,
|
||||
Bge_Un,
|
||||
Bgt_Un,
|
||||
Ble_Un,
|
||||
Blt_Un,
|
||||
Switch,
|
||||
Ldind_I1,
|
||||
Ldind_U1,
|
||||
Ldind_I2,
|
||||
Ldind_U2,
|
||||
Ldind_I4,
|
||||
Ldind_U4,
|
||||
Ldind_I8,
|
||||
Ldind_I,
|
||||
Ldind_R4,
|
||||
Ldind_R8,
|
||||
Ldind_Ref,
|
||||
Stind_Ref,
|
||||
Stind_I1,
|
||||
Stind_I2,
|
||||
Stind_I4,
|
||||
Stind_I8,
|
||||
Stind_R4,
|
||||
Stind_R8,
|
||||
Add,
|
||||
Sub,
|
||||
Mul,
|
||||
Div,
|
||||
Div_Un,
|
||||
Rem,
|
||||
Rem_Un,
|
||||
And,
|
||||
Or,
|
||||
Xor,
|
||||
Shl,
|
||||
Shr,
|
||||
Shr_Un,
|
||||
Neg,
|
||||
Not,
|
||||
Conv_I1,
|
||||
Conv_I2,
|
||||
Conv_I4,
|
||||
Conv_I8,
|
||||
Conv_R4,
|
||||
Conv_R8,
|
||||
Conv_U4,
|
||||
Conv_U8,
|
||||
Callvirt,
|
||||
Cpobj,
|
||||
Ldobj,
|
||||
Ldstr,
|
||||
Newobj,
|
||||
Castclass,
|
||||
Isinst,
|
||||
Conv_R_Un,
|
||||
Unbox,
|
||||
Throw,
|
||||
Ldfld,
|
||||
Ldflda,
|
||||
Stfld,
|
||||
Ldsfld,
|
||||
Ldsflda,
|
||||
Stsfld,
|
||||
Stobj,
|
||||
Conv_Ovf_I1_Un,
|
||||
Conv_Ovf_I2_Un,
|
||||
Conv_Ovf_I4_Un,
|
||||
Conv_Ovf_I8_Un,
|
||||
Conv_Ovf_U1_Un,
|
||||
Conv_Ovf_U2_Un,
|
||||
Conv_Ovf_U4_Un,
|
||||
Conv_Ovf_U8_Un,
|
||||
Conv_Ovf_I_Un,
|
||||
Conv_Ovf_U_Un,
|
||||
Box,
|
||||
Newarr,
|
||||
Ldlen,
|
||||
Ldelema,
|
||||
Ldelem_I1,
|
||||
Ldelem_U1,
|
||||
Ldelem_I2,
|
||||
Ldelem_U2,
|
||||
Ldelem_I4,
|
||||
Ldelem_U4,
|
||||
Ldelem_I8,
|
||||
Ldelem_I,
|
||||
Ldelem_R4,
|
||||
Ldelem_R8,
|
||||
Ldelem_Ref,
|
||||
Stelem_I,
|
||||
Stelem_I1,
|
||||
Stelem_I2,
|
||||
Stelem_I4,
|
||||
Stelem_I8,
|
||||
Stelem_R4,
|
||||
Stelem_R8,
|
||||
Stelem_Ref,
|
||||
Ldelem_Any,
|
||||
Stelem_Any,
|
||||
Unbox_Any,
|
||||
Conv_Ovf_I1,
|
||||
Conv_Ovf_U1,
|
||||
Conv_Ovf_I2,
|
||||
Conv_Ovf_U2,
|
||||
Conv_Ovf_I4,
|
||||
Conv_Ovf_U4,
|
||||
Conv_Ovf_I8,
|
||||
Conv_Ovf_U8,
|
||||
Refanyval,
|
||||
Ckfinite,
|
||||
Mkrefany,
|
||||
Ldtoken,
|
||||
Conv_U2,
|
||||
Conv_U1,
|
||||
Conv_I,
|
||||
Conv_Ovf_I,
|
||||
Conv_Ovf_U,
|
||||
Add_Ovf,
|
||||
Add_Ovf_Un,
|
||||
Mul_Ovf,
|
||||
Mul_Ovf_Un,
|
||||
Sub_Ovf,
|
||||
Sub_Ovf_Un,
|
||||
Endfinally,
|
||||
Leave,
|
||||
Leave_S,
|
||||
Stind_I,
|
||||
Conv_U,
|
||||
Arglist,
|
||||
Ceq,
|
||||
Cgt,
|
||||
Cgt_Un,
|
||||
Clt,
|
||||
Clt_Un,
|
||||
Ldftn,
|
||||
Ldvirtftn,
|
||||
Ldarg,
|
||||
Ldarga,
|
||||
Starg,
|
||||
Ldloc,
|
||||
Ldloca,
|
||||
Stloc,
|
||||
Localloc,
|
||||
Endfilter,
|
||||
Unaligned,
|
||||
Volatile,
|
||||
Tail,
|
||||
Initobj,
|
||||
Constrained,
|
||||
Cpblk,
|
||||
Initblk,
|
||||
No,
|
||||
Rethrow,
|
||||
Sizeof,
|
||||
Refanytype,
|
||||
Readonly,
|
||||
}
|
||||
}
|
647
external/linker/cecil/Mono.Cecil.Cil/CodeReader.cs
vendored
Normal file
647
external/linker/cecil/Mono.Cecil.Cil/CodeReader.cs
vendored
Normal file
File diff suppressed because it is too large
Load Diff
628
external/linker/cecil/Mono.Cecil.Cil/CodeWriter.cs
vendored
Normal file
628
external/linker/cecil/Mono.Cecil.Cil/CodeWriter.cs
vendored
Normal file
File diff suppressed because it is too large
Load Diff
96
external/linker/cecil/Mono.Cecil.Cil/Document.cs
vendored
Normal file
96
external/linker/cecil/Mono.Cecil.Cil/Document.cs
vendored
Normal file
@@ -0,0 +1,96 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using System;
|
||||
|
||||
namespace Mono.Cecil.Cil {
|
||||
|
||||
public enum DocumentType {
|
||||
Other,
|
||||
Text,
|
||||
}
|
||||
|
||||
public enum DocumentHashAlgorithm {
|
||||
None,
|
||||
MD5,
|
||||
SHA1,
|
||||
SHA256,
|
||||
}
|
||||
|
||||
public enum DocumentLanguage {
|
||||
Other,
|
||||
C,
|
||||
Cpp,
|
||||
CSharp,
|
||||
Basic,
|
||||
Java,
|
||||
Cobol,
|
||||
Pascal,
|
||||
Cil,
|
||||
JScript,
|
||||
Smc,
|
||||
MCpp,
|
||||
FSharp,
|
||||
}
|
||||
|
||||
public enum DocumentLanguageVendor {
|
||||
Other,
|
||||
Microsoft,
|
||||
}
|
||||
|
||||
public sealed class Document : DebugInformation {
|
||||
|
||||
string url;
|
||||
|
||||
byte type;
|
||||
byte hash_algorithm;
|
||||
byte language;
|
||||
byte language_vendor;
|
||||
|
||||
byte [] hash;
|
||||
|
||||
public string Url {
|
||||
get { return url; }
|
||||
set { url = value; }
|
||||
}
|
||||
|
||||
public DocumentType Type {
|
||||
get { return (DocumentType) type; }
|
||||
set { type = (byte) value; }
|
||||
}
|
||||
|
||||
public DocumentHashAlgorithm HashAlgorithm {
|
||||
get { return (DocumentHashAlgorithm) hash_algorithm; }
|
||||
set { hash_algorithm = (byte) value; }
|
||||
}
|
||||
|
||||
public DocumentLanguage Language {
|
||||
get { return (DocumentLanguage) language; }
|
||||
set { language = (byte) value; }
|
||||
}
|
||||
|
||||
public DocumentLanguageVendor LanguageVendor {
|
||||
get { return (DocumentLanguageVendor) language_vendor; }
|
||||
set { language_vendor = (byte) value; }
|
||||
}
|
||||
|
||||
public byte [] Hash {
|
||||
get { return hash; }
|
||||
set { hash = value; }
|
||||
}
|
||||
|
||||
public Document (string url)
|
||||
{
|
||||
this.url = url;
|
||||
this.hash = Empty<byte>.Array;
|
||||
this.token = new MetadataToken (TokenType.Document);
|
||||
}
|
||||
}
|
||||
}
|
71
external/linker/cecil/Mono.Cecil.Cil/ExceptionHandler.cs
vendored
Normal file
71
external/linker/cecil/Mono.Cecil.Cil/ExceptionHandler.cs
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
namespace Mono.Cecil.Cil {
|
||||
|
||||
public enum ExceptionHandlerType {
|
||||
Catch = 0,
|
||||
Filter = 1,
|
||||
Finally = 2,
|
||||
Fault = 4,
|
||||
}
|
||||
|
||||
public sealed class ExceptionHandler {
|
||||
|
||||
Instruction try_start;
|
||||
Instruction try_end;
|
||||
Instruction filter_start;
|
||||
Instruction handler_start;
|
||||
Instruction handler_end;
|
||||
|
||||
TypeReference catch_type;
|
||||
ExceptionHandlerType handler_type;
|
||||
|
||||
public Instruction TryStart {
|
||||
get { return try_start; }
|
||||
set { try_start = value; }
|
||||
}
|
||||
|
||||
public Instruction TryEnd {
|
||||
get { return try_end; }
|
||||
set { try_end = value; }
|
||||
}
|
||||
|
||||
public Instruction FilterStart {
|
||||
get { return filter_start; }
|
||||
set { filter_start = value; }
|
||||
}
|
||||
|
||||
public Instruction HandlerStart {
|
||||
get { return handler_start; }
|
||||
set { handler_start = value; }
|
||||
}
|
||||
|
||||
public Instruction HandlerEnd {
|
||||
get { return handler_end; }
|
||||
set { handler_end = value; }
|
||||
}
|
||||
|
||||
public TypeReference CatchType {
|
||||
get { return catch_type; }
|
||||
set { catch_type = value; }
|
||||
}
|
||||
|
||||
public ExceptionHandlerType HandlerType {
|
||||
get { return handler_type; }
|
||||
set { handler_type = value; }
|
||||
}
|
||||
|
||||
public ExceptionHandler (ExceptionHandlerType handlerType)
|
||||
{
|
||||
this.handler_type = handlerType;
|
||||
}
|
||||
}
|
||||
}
|
260
external/linker/cecil/Mono.Cecil.Cil/ILProcessor.cs
vendored
Normal file
260
external/linker/cecil/Mono.Cecil.Cil/ILProcessor.cs
vendored
Normal file
@@ -0,0 +1,260 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using System;
|
||||
|
||||
using Mono.Collections.Generic;
|
||||
|
||||
namespace Mono.Cecil.Cil {
|
||||
|
||||
public sealed class ILProcessor {
|
||||
|
||||
readonly MethodBody body;
|
||||
readonly Collection<Instruction> instructions;
|
||||
|
||||
public MethodBody Body {
|
||||
get { return body; }
|
||||
}
|
||||
|
||||
internal ILProcessor (MethodBody body)
|
||||
{
|
||||
this.body = body;
|
||||
this.instructions = body.Instructions;
|
||||
}
|
||||
|
||||
public Instruction Create (OpCode opcode)
|
||||
{
|
||||
return Instruction.Create (opcode);
|
||||
}
|
||||
|
||||
public Instruction Create (OpCode opcode, TypeReference type)
|
||||
{
|
||||
return Instruction.Create (opcode, type);
|
||||
}
|
||||
|
||||
public Instruction Create (OpCode opcode, CallSite site)
|
||||
{
|
||||
return Instruction.Create (opcode, site);
|
||||
}
|
||||
|
||||
public Instruction Create (OpCode opcode, MethodReference method)
|
||||
{
|
||||
return Instruction.Create (opcode, method);
|
||||
}
|
||||
|
||||
public Instruction Create (OpCode opcode, FieldReference field)
|
||||
{
|
||||
return Instruction.Create (opcode, field);
|
||||
}
|
||||
|
||||
public Instruction Create (OpCode opcode, string value)
|
||||
{
|
||||
return Instruction.Create (opcode, value);
|
||||
}
|
||||
|
||||
public Instruction Create (OpCode opcode, sbyte value)
|
||||
{
|
||||
return Instruction.Create (opcode, value);
|
||||
}
|
||||
|
||||
public Instruction Create (OpCode opcode, byte value)
|
||||
{
|
||||
if (opcode.OperandType == OperandType.ShortInlineVar)
|
||||
return Instruction.Create (opcode, body.Variables [value]);
|
||||
|
||||
if (opcode.OperandType == OperandType.ShortInlineArg)
|
||||
return Instruction.Create (opcode, body.GetParameter (value));
|
||||
|
||||
return Instruction.Create (opcode, value);
|
||||
}
|
||||
|
||||
public Instruction Create (OpCode opcode, int value)
|
||||
{
|
||||
if (opcode.OperandType == OperandType.InlineVar)
|
||||
return Instruction.Create (opcode, body.Variables [value]);
|
||||
|
||||
if (opcode.OperandType == OperandType.InlineArg)
|
||||
return Instruction.Create (opcode, body.GetParameter (value));
|
||||
|
||||
return Instruction.Create (opcode, value);
|
||||
}
|
||||
|
||||
public Instruction Create (OpCode opcode, long value)
|
||||
{
|
||||
return Instruction.Create (opcode, value);
|
||||
}
|
||||
|
||||
public Instruction Create (OpCode opcode, float value)
|
||||
{
|
||||
return Instruction.Create (opcode, value);
|
||||
}
|
||||
|
||||
public Instruction Create (OpCode opcode, double value)
|
||||
{
|
||||
return Instruction.Create (opcode, value);
|
||||
}
|
||||
|
||||
public Instruction Create (OpCode opcode, Instruction target)
|
||||
{
|
||||
return Instruction.Create (opcode, target);
|
||||
}
|
||||
|
||||
public Instruction Create (OpCode opcode, Instruction [] targets)
|
||||
{
|
||||
return Instruction.Create (opcode, targets);
|
||||
}
|
||||
|
||||
public Instruction Create (OpCode opcode, VariableDefinition variable)
|
||||
{
|
||||
return Instruction.Create (opcode, variable);
|
||||
}
|
||||
|
||||
public Instruction Create (OpCode opcode, ParameterDefinition parameter)
|
||||
{
|
||||
return Instruction.Create (opcode, parameter);
|
||||
}
|
||||
|
||||
public void Emit (OpCode opcode)
|
||||
{
|
||||
Append (Create (opcode));
|
||||
}
|
||||
|
||||
public void Emit (OpCode opcode, TypeReference type)
|
||||
{
|
||||
Append (Create (opcode, type));
|
||||
}
|
||||
|
||||
public void Emit (OpCode opcode, MethodReference method)
|
||||
{
|
||||
Append (Create (opcode, method));
|
||||
}
|
||||
|
||||
public void Emit (OpCode opcode, CallSite site)
|
||||
{
|
||||
Append (Create (opcode, site));
|
||||
}
|
||||
|
||||
public void Emit (OpCode opcode, FieldReference field)
|
||||
{
|
||||
Append (Create (opcode, field));
|
||||
}
|
||||
|
||||
public void Emit (OpCode opcode, string value)
|
||||
{
|
||||
Append (Create (opcode, value));
|
||||
}
|
||||
|
||||
public void Emit (OpCode opcode, byte value)
|
||||
{
|
||||
Append (Create (opcode, value));
|
||||
}
|
||||
|
||||
public void Emit (OpCode opcode, sbyte value)
|
||||
{
|
||||
Append (Create (opcode, value));
|
||||
}
|
||||
|
||||
public void Emit (OpCode opcode, int value)
|
||||
{
|
||||
Append (Create (opcode, value));
|
||||
}
|
||||
|
||||
public void Emit (OpCode opcode, long value)
|
||||
{
|
||||
Append (Create (opcode, value));
|
||||
}
|
||||
|
||||
public void Emit (OpCode opcode, float value)
|
||||
{
|
||||
Append (Create (opcode, value));
|
||||
}
|
||||
|
||||
public void Emit (OpCode opcode, double value)
|
||||
{
|
||||
Append (Create (opcode, value));
|
||||
}
|
||||
|
||||
public void Emit (OpCode opcode, Instruction target)
|
||||
{
|
||||
Append (Create (opcode, target));
|
||||
}
|
||||
|
||||
public void Emit (OpCode opcode, Instruction [] targets)
|
||||
{
|
||||
Append (Create (opcode, targets));
|
||||
}
|
||||
|
||||
public void Emit (OpCode opcode, VariableDefinition variable)
|
||||
{
|
||||
Append (Create (opcode, variable));
|
||||
}
|
||||
|
||||
public void Emit (OpCode opcode, ParameterDefinition parameter)
|
||||
{
|
||||
Append (Create (opcode, parameter));
|
||||
}
|
||||
|
||||
public void InsertBefore (Instruction target, Instruction instruction)
|
||||
{
|
||||
if (target == null)
|
||||
throw new ArgumentNullException ("target");
|
||||
if (instruction == null)
|
||||
throw new ArgumentNullException ("instruction");
|
||||
|
||||
var index = instructions.IndexOf (target);
|
||||
if (index == -1)
|
||||
throw new ArgumentOutOfRangeException ("target");
|
||||
|
||||
instructions.Insert (index, instruction);
|
||||
}
|
||||
|
||||
public void InsertAfter (Instruction target, Instruction instruction)
|
||||
{
|
||||
if (target == null)
|
||||
throw new ArgumentNullException ("target");
|
||||
if (instruction == null)
|
||||
throw new ArgumentNullException ("instruction");
|
||||
|
||||
var index = instructions.IndexOf (target);
|
||||
if (index == -1)
|
||||
throw new ArgumentOutOfRangeException ("target");
|
||||
|
||||
instructions.Insert (index + 1, instruction);
|
||||
}
|
||||
|
||||
public void Append (Instruction instruction)
|
||||
{
|
||||
if (instruction == null)
|
||||
throw new ArgumentNullException ("instruction");
|
||||
|
||||
instructions.Add (instruction);
|
||||
}
|
||||
|
||||
public void Replace (Instruction target, Instruction instruction)
|
||||
{
|
||||
if (target == null)
|
||||
throw new ArgumentNullException ("target");
|
||||
if (instruction == null)
|
||||
throw new ArgumentNullException ("instruction");
|
||||
|
||||
InsertAfter (target, instruction);
|
||||
Remove (target);
|
||||
}
|
||||
|
||||
public void Remove (Instruction instruction)
|
||||
{
|
||||
if (instruction == null)
|
||||
throw new ArgumentNullException ("instruction");
|
||||
|
||||
if (!instructions.Remove (instruction))
|
||||
throw new ArgumentOutOfRangeException ("instruction");
|
||||
}
|
||||
}
|
||||
}
|
301
external/linker/cecil/Mono.Cecil.Cil/Instruction.cs
vendored
Normal file
301
external/linker/cecil/Mono.Cecil.Cil/Instruction.cs
vendored
Normal file
@@ -0,0 +1,301 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using System;
|
||||
using System.Text;
|
||||
|
||||
namespace Mono.Cecil.Cil {
|
||||
|
||||
public sealed class Instruction {
|
||||
|
||||
internal int offset;
|
||||
internal OpCode opcode;
|
||||
internal object operand;
|
||||
|
||||
internal Instruction previous;
|
||||
internal Instruction next;
|
||||
|
||||
public int Offset {
|
||||
get { return offset; }
|
||||
set { offset = value; }
|
||||
}
|
||||
|
||||
public OpCode OpCode {
|
||||
get { return opcode; }
|
||||
set { opcode = value; }
|
||||
}
|
||||
|
||||
public object Operand {
|
||||
get { return operand; }
|
||||
set { operand = value; }
|
||||
}
|
||||
|
||||
public Instruction Previous {
|
||||
get { return previous; }
|
||||
set { previous = value; }
|
||||
}
|
||||
|
||||
public Instruction Next {
|
||||
get { return next; }
|
||||
set { next = value; }
|
||||
}
|
||||
|
||||
internal Instruction (int offset, OpCode opCode)
|
||||
{
|
||||
this.offset = offset;
|
||||
this.opcode = opCode;
|
||||
}
|
||||
|
||||
internal Instruction (OpCode opcode, object operand)
|
||||
{
|
||||
this.opcode = opcode;
|
||||
this.operand = operand;
|
||||
}
|
||||
|
||||
public int GetSize ()
|
||||
{
|
||||
int size = opcode.Size;
|
||||
|
||||
switch (opcode.OperandType) {
|
||||
case OperandType.InlineSwitch:
|
||||
return size + (1 + ((Instruction []) operand).Length) * 4;
|
||||
case OperandType.InlineI8:
|
||||
case OperandType.InlineR:
|
||||
return size + 8;
|
||||
case OperandType.InlineBrTarget:
|
||||
case OperandType.InlineField:
|
||||
case OperandType.InlineI:
|
||||
case OperandType.InlineMethod:
|
||||
case OperandType.InlineString:
|
||||
case OperandType.InlineTok:
|
||||
case OperandType.InlineType:
|
||||
case OperandType.ShortInlineR:
|
||||
case OperandType.InlineSig:
|
||||
return size + 4;
|
||||
case OperandType.InlineArg:
|
||||
case OperandType.InlineVar:
|
||||
return size + 2;
|
||||
case OperandType.ShortInlineBrTarget:
|
||||
case OperandType.ShortInlineI:
|
||||
case OperandType.ShortInlineArg:
|
||||
case OperandType.ShortInlineVar:
|
||||
return size + 1;
|
||||
default:
|
||||
return size;
|
||||
}
|
||||
}
|
||||
|
||||
public override string ToString ()
|
||||
{
|
||||
var instruction = new StringBuilder ();
|
||||
|
||||
AppendLabel (instruction, this);
|
||||
instruction.Append (':');
|
||||
instruction.Append (' ');
|
||||
instruction.Append (opcode.Name);
|
||||
|
||||
if (operand == null)
|
||||
return instruction.ToString ();
|
||||
|
||||
instruction.Append (' ');
|
||||
|
||||
switch (opcode.OperandType) {
|
||||
case OperandType.ShortInlineBrTarget:
|
||||
case OperandType.InlineBrTarget:
|
||||
AppendLabel (instruction, operand);
|
||||
break;
|
||||
case OperandType.InlineSwitch:
|
||||
var labels = (Instruction []) operand;
|
||||
for (int i = 0; i < labels.Length; i++) {
|
||||
if (i > 0)
|
||||
instruction.Append (',');
|
||||
|
||||
AppendLabel (instruction, labels [i]);
|
||||
}
|
||||
break;
|
||||
case OperandType.InlineString:
|
||||
instruction.Append ('\"');
|
||||
instruction.Append (operand);
|
||||
instruction.Append ('\"');
|
||||
break;
|
||||
default:
|
||||
instruction.Append (operand);
|
||||
break;
|
||||
}
|
||||
|
||||
return instruction.ToString ();
|
||||
}
|
||||
|
||||
static void AppendLabel (StringBuilder builder, object o)
|
||||
{
|
||||
builder.Append ("IL_");
|
||||
if (o is Instruction)
|
||||
builder.Append ((o as Instruction).offset.ToString ("x4"));
|
||||
else if (o is int) {
|
||||
builder.Append (((int)o).ToString ("x4"));
|
||||
builder.Append (" (invalid)");
|
||||
}
|
||||
}
|
||||
|
||||
public static Instruction Create (OpCode opcode)
|
||||
{
|
||||
if (opcode.OperandType != OperandType.InlineNone)
|
||||
throw new ArgumentException ("opcode");
|
||||
|
||||
return new Instruction (opcode, null);
|
||||
}
|
||||
|
||||
public static Instruction Create (OpCode opcode, TypeReference type)
|
||||
{
|
||||
if (type == null)
|
||||
throw new ArgumentNullException ("type");
|
||||
if (opcode.OperandType != OperandType.InlineType &&
|
||||
opcode.OperandType != OperandType.InlineTok)
|
||||
throw new ArgumentException ("opcode");
|
||||
|
||||
return new Instruction (opcode, type);
|
||||
}
|
||||
|
||||
public static Instruction Create (OpCode opcode, CallSite site)
|
||||
{
|
||||
if (site == null)
|
||||
throw new ArgumentNullException ("site");
|
||||
if (opcode.Code != Code.Calli)
|
||||
throw new ArgumentException ("code");
|
||||
|
||||
return new Instruction (opcode, site);
|
||||
}
|
||||
|
||||
public static Instruction Create (OpCode opcode, MethodReference method)
|
||||
{
|
||||
if (method == null)
|
||||
throw new ArgumentNullException ("method");
|
||||
if (opcode.OperandType != OperandType.InlineMethod &&
|
||||
opcode.OperandType != OperandType.InlineTok)
|
||||
throw new ArgumentException ("opcode");
|
||||
|
||||
return new Instruction (opcode, method);
|
||||
}
|
||||
|
||||
public static Instruction Create (OpCode opcode, FieldReference field)
|
||||
{
|
||||
if (field == null)
|
||||
throw new ArgumentNullException ("field");
|
||||
if (opcode.OperandType != OperandType.InlineField &&
|
||||
opcode.OperandType != OperandType.InlineTok)
|
||||
throw new ArgumentException ("opcode");
|
||||
|
||||
return new Instruction (opcode, field);
|
||||
}
|
||||
|
||||
public static Instruction Create (OpCode opcode, string value)
|
||||
{
|
||||
if (value == null)
|
||||
throw new ArgumentNullException ("value");
|
||||
if (opcode.OperandType != OperandType.InlineString)
|
||||
throw new ArgumentException ("opcode");
|
||||
|
||||
return new Instruction (opcode, value);
|
||||
}
|
||||
|
||||
public static Instruction Create (OpCode opcode, sbyte value)
|
||||
{
|
||||
if (opcode.OperandType != OperandType.ShortInlineI &&
|
||||
opcode != OpCodes.Ldc_I4_S)
|
||||
throw new ArgumentException ("opcode");
|
||||
|
||||
return new Instruction (opcode, value);
|
||||
}
|
||||
|
||||
public static Instruction Create (OpCode opcode, byte value)
|
||||
{
|
||||
if (opcode.OperandType != OperandType.ShortInlineI ||
|
||||
opcode == OpCodes.Ldc_I4_S)
|
||||
throw new ArgumentException ("opcode");
|
||||
|
||||
return new Instruction (opcode, value);
|
||||
}
|
||||
|
||||
public static Instruction Create (OpCode opcode, int value)
|
||||
{
|
||||
if (opcode.OperandType != OperandType.InlineI)
|
||||
throw new ArgumentException ("opcode");
|
||||
|
||||
return new Instruction (opcode, value);
|
||||
}
|
||||
|
||||
public static Instruction Create (OpCode opcode, long value)
|
||||
{
|
||||
if (opcode.OperandType != OperandType.InlineI8)
|
||||
throw new ArgumentException ("opcode");
|
||||
|
||||
return new Instruction (opcode, value);
|
||||
}
|
||||
|
||||
public static Instruction Create (OpCode opcode, float value)
|
||||
{
|
||||
if (opcode.OperandType != OperandType.ShortInlineR)
|
||||
throw new ArgumentException ("opcode");
|
||||
|
||||
return new Instruction (opcode, value);
|
||||
}
|
||||
|
||||
public static Instruction Create (OpCode opcode, double value)
|
||||
{
|
||||
if (opcode.OperandType != OperandType.InlineR)
|
||||
throw new ArgumentException ("opcode");
|
||||
|
||||
return new Instruction (opcode, value);
|
||||
}
|
||||
|
||||
public static Instruction Create (OpCode opcode, Instruction target)
|
||||
{
|
||||
if (target == null)
|
||||
throw new ArgumentNullException ("target");
|
||||
if (opcode.OperandType != OperandType.InlineBrTarget &&
|
||||
opcode.OperandType != OperandType.ShortInlineBrTarget)
|
||||
throw new ArgumentException ("opcode");
|
||||
|
||||
return new Instruction (opcode, target);
|
||||
}
|
||||
|
||||
public static Instruction Create (OpCode opcode, Instruction [] targets)
|
||||
{
|
||||
if (targets == null)
|
||||
throw new ArgumentNullException ("targets");
|
||||
if (opcode.OperandType != OperandType.InlineSwitch)
|
||||
throw new ArgumentException ("opcode");
|
||||
|
||||
return new Instruction (opcode, targets);
|
||||
}
|
||||
|
||||
public static Instruction Create (OpCode opcode, VariableDefinition variable)
|
||||
{
|
||||
if (variable == null)
|
||||
throw new ArgumentNullException ("variable");
|
||||
if (opcode.OperandType != OperandType.ShortInlineVar &&
|
||||
opcode.OperandType != OperandType.InlineVar)
|
||||
throw new ArgumentException ("opcode");
|
||||
|
||||
return new Instruction (opcode, variable);
|
||||
}
|
||||
|
||||
public static Instruction Create (OpCode opcode, ParameterDefinition parameter)
|
||||
{
|
||||
if (parameter == null)
|
||||
throw new ArgumentNullException ("parameter");
|
||||
if (opcode.OperandType != OperandType.ShortInlineArg &&
|
||||
opcode.OperandType != OperandType.InlineArg)
|
||||
throw new ArgumentException ("opcode");
|
||||
|
||||
return new Instruction (opcode, parameter);
|
||||
}
|
||||
}
|
||||
}
|
248
external/linker/cecil/Mono.Cecil.Cil/MethodBody.cs
vendored
Normal file
248
external/linker/cecil/Mono.Cecil.Cil/MethodBody.cs
vendored
Normal file
@@ -0,0 +1,248 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using System;
|
||||
using System.Threading;
|
||||
|
||||
using Mono.Collections.Generic;
|
||||
|
||||
namespace Mono.Cecil.Cil {
|
||||
|
||||
public sealed class MethodBody {
|
||||
|
||||
readonly internal MethodDefinition method;
|
||||
|
||||
internal ParameterDefinition this_parameter;
|
||||
internal int max_stack_size;
|
||||
internal int code_size;
|
||||
internal bool init_locals;
|
||||
internal MetadataToken local_var_token;
|
||||
|
||||
internal Collection<Instruction> instructions;
|
||||
internal Collection<ExceptionHandler> exceptions;
|
||||
internal Collection<VariableDefinition> variables;
|
||||
|
||||
public MethodDefinition Method {
|
||||
get { return method; }
|
||||
}
|
||||
|
||||
public int MaxStackSize {
|
||||
get { return max_stack_size; }
|
||||
set { max_stack_size = value; }
|
||||
}
|
||||
|
||||
public int CodeSize {
|
||||
get { return code_size; }
|
||||
}
|
||||
|
||||
public bool InitLocals {
|
||||
get { return init_locals; }
|
||||
set { init_locals = value; }
|
||||
}
|
||||
|
||||
public MetadataToken LocalVarToken {
|
||||
get { return local_var_token; }
|
||||
set { local_var_token = value; }
|
||||
}
|
||||
|
||||
public Collection<Instruction> Instructions {
|
||||
get { return instructions ?? (instructions = new InstructionCollection (method)); }
|
||||
}
|
||||
|
||||
public bool HasExceptionHandlers {
|
||||
get { return !exceptions.IsNullOrEmpty (); }
|
||||
}
|
||||
|
||||
public Collection<ExceptionHandler> ExceptionHandlers {
|
||||
get { return exceptions ?? (exceptions = new Collection<ExceptionHandler> ()); }
|
||||
}
|
||||
|
||||
public bool HasVariables {
|
||||
get { return !variables.IsNullOrEmpty (); }
|
||||
}
|
||||
|
||||
public Collection<VariableDefinition> Variables {
|
||||
get { return variables ?? (variables = new VariableDefinitionCollection ()); }
|
||||
}
|
||||
|
||||
public ParameterDefinition ThisParameter {
|
||||
get {
|
||||
if (method == null || method.DeclaringType == null)
|
||||
throw new NotSupportedException ();
|
||||
|
||||
if (!method.HasThis)
|
||||
return null;
|
||||
|
||||
if (this_parameter == null)
|
||||
Interlocked.CompareExchange (ref this_parameter, CreateThisParameter (method), null);
|
||||
|
||||
return this_parameter;
|
||||
}
|
||||
}
|
||||
|
||||
static ParameterDefinition CreateThisParameter (MethodDefinition method)
|
||||
{
|
||||
var parameter_type = method.DeclaringType as TypeReference;
|
||||
|
||||
if (parameter_type.HasGenericParameters) {
|
||||
var instance = new GenericInstanceType (parameter_type);
|
||||
for (int i = 0; i < parameter_type.GenericParameters.Count; i++)
|
||||
instance.GenericArguments.Add (parameter_type.GenericParameters [i]);
|
||||
|
||||
parameter_type = instance;
|
||||
|
||||
}
|
||||
|
||||
if (parameter_type.IsValueType || parameter_type.IsPrimitive)
|
||||
parameter_type = new ByReferenceType (parameter_type);
|
||||
|
||||
return new ParameterDefinition (parameter_type, method);
|
||||
}
|
||||
|
||||
public MethodBody (MethodDefinition method)
|
||||
{
|
||||
this.method = method;
|
||||
}
|
||||
|
||||
public ILProcessor GetILProcessor ()
|
||||
{
|
||||
return new ILProcessor (this);
|
||||
}
|
||||
}
|
||||
|
||||
sealed class VariableDefinitionCollection : Collection<VariableDefinition> {
|
||||
|
||||
internal VariableDefinitionCollection ()
|
||||
{
|
||||
}
|
||||
|
||||
internal VariableDefinitionCollection (int capacity)
|
||||
: base (capacity)
|
||||
{
|
||||
}
|
||||
|
||||
protected override void OnAdd (VariableDefinition item, int index)
|
||||
{
|
||||
item.index = index;
|
||||
}
|
||||
|
||||
protected override void OnInsert (VariableDefinition item, int index)
|
||||
{
|
||||
item.index = index;
|
||||
|
||||
for (int i = index; i < size; i++)
|
||||
items [i].index = i + 1;
|
||||
}
|
||||
|
||||
protected override void OnSet (VariableDefinition item, int index)
|
||||
{
|
||||
item.index = index;
|
||||
}
|
||||
|
||||
protected override void OnRemove (VariableDefinition item, int index)
|
||||
{
|
||||
item.index = -1;
|
||||
|
||||
for (int i = index + 1; i < size; i++)
|
||||
items [i].index = i - 1;
|
||||
}
|
||||
}
|
||||
|
||||
class InstructionCollection : Collection<Instruction> {
|
||||
|
||||
readonly MethodDefinition method;
|
||||
|
||||
internal InstructionCollection (MethodDefinition method)
|
||||
{
|
||||
this.method = method;
|
||||
}
|
||||
|
||||
internal InstructionCollection (MethodDefinition method, int capacity)
|
||||
: base (capacity)
|
||||
{
|
||||
this.method = method;
|
||||
}
|
||||
|
||||
protected override void OnAdd (Instruction item, int index)
|
||||
{
|
||||
if (index == 0)
|
||||
return;
|
||||
|
||||
var previous = items [index - 1];
|
||||
previous.next = item;
|
||||
item.previous = previous;
|
||||
}
|
||||
|
||||
protected override void OnInsert (Instruction item, int index)
|
||||
{
|
||||
if (size == 0)
|
||||
return;
|
||||
|
||||
var current = items [index];
|
||||
if (current == null) {
|
||||
var last = items [index - 1];
|
||||
last.next = item;
|
||||
item.previous = last;
|
||||
return;
|
||||
}
|
||||
|
||||
var previous = current.previous;
|
||||
if (previous != null) {
|
||||
previous.next = item;
|
||||
item.previous = previous;
|
||||
}
|
||||
|
||||
current.previous = item;
|
||||
item.next = current;
|
||||
}
|
||||
|
||||
protected override void OnSet (Instruction item, int index)
|
||||
{
|
||||
var current = items [index];
|
||||
|
||||
item.previous = current.previous;
|
||||
item.next = current.next;
|
||||
|
||||
current.previous = null;
|
||||
current.next = null;
|
||||
}
|
||||
|
||||
protected override void OnRemove (Instruction item, int index)
|
||||
{
|
||||
var previous = item.previous;
|
||||
if (previous != null)
|
||||
previous.next = item.next;
|
||||
|
||||
var next = item.next;
|
||||
if (next != null)
|
||||
next.previous = item.previous;
|
||||
|
||||
RemoveSequencePoint (item);
|
||||
|
||||
item.previous = null;
|
||||
item.next = null;
|
||||
}
|
||||
|
||||
void RemoveSequencePoint (Instruction instruction)
|
||||
{
|
||||
var debug_info = method.debug_info;
|
||||
if (debug_info == null || !debug_info.HasSequencePoints)
|
||||
return;
|
||||
|
||||
var sequence_points = debug_info.sequence_points;
|
||||
for (int i = 0; i < sequence_points.Count; i++) {
|
||||
if (sequence_points [i].Offset == instruction.offset) {
|
||||
sequence_points.RemoveAt (i);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
439
external/linker/cecil/Mono.Cecil.Cil/OpCode.cs
vendored
Normal file
439
external/linker/cecil/Mono.Cecil.Cil/OpCode.cs
vendored
Normal file
@@ -0,0 +1,439 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using System;
|
||||
|
||||
namespace Mono.Cecil.Cil {
|
||||
|
||||
public enum FlowControl {
|
||||
Branch,
|
||||
Break,
|
||||
Call,
|
||||
Cond_Branch,
|
||||
Meta,
|
||||
Next,
|
||||
Phi,
|
||||
Return,
|
||||
Throw,
|
||||
}
|
||||
|
||||
public enum OpCodeType {
|
||||
Annotation,
|
||||
Macro,
|
||||
Nternal,
|
||||
Objmodel,
|
||||
Prefix,
|
||||
Primitive,
|
||||
}
|
||||
|
||||
public enum OperandType {
|
||||
InlineBrTarget,
|
||||
InlineField,
|
||||
InlineI,
|
||||
InlineI8,
|
||||
InlineMethod,
|
||||
InlineNone,
|
||||
InlinePhi,
|
||||
InlineR,
|
||||
InlineSig,
|
||||
InlineString,
|
||||
InlineSwitch,
|
||||
InlineTok,
|
||||
InlineType,
|
||||
InlineVar,
|
||||
InlineArg,
|
||||
ShortInlineBrTarget,
|
||||
ShortInlineI,
|
||||
ShortInlineR,
|
||||
ShortInlineVar,
|
||||
ShortInlineArg,
|
||||
}
|
||||
|
||||
public enum StackBehaviour {
|
||||
Pop0,
|
||||
Pop1,
|
||||
Pop1_pop1,
|
||||
Popi,
|
||||
Popi_pop1,
|
||||
Popi_popi,
|
||||
Popi_popi8,
|
||||
Popi_popi_popi,
|
||||
Popi_popr4,
|
||||
Popi_popr8,
|
||||
Popref,
|
||||
Popref_pop1,
|
||||
Popref_popi,
|
||||
Popref_popi_popi,
|
||||
Popref_popi_popi8,
|
||||
Popref_popi_popr4,
|
||||
Popref_popi_popr8,
|
||||
Popref_popi_popref,
|
||||
PopAll,
|
||||
Push0,
|
||||
Push1,
|
||||
Push1_push1,
|
||||
Pushi,
|
||||
Pushi8,
|
||||
Pushr4,
|
||||
Pushr8,
|
||||
Pushref,
|
||||
Varpop,
|
||||
Varpush,
|
||||
}
|
||||
|
||||
public struct OpCode : IEquatable<OpCode> {
|
||||
|
||||
readonly byte op1;
|
||||
readonly byte op2;
|
||||
readonly byte code;
|
||||
readonly byte flow_control;
|
||||
readonly byte opcode_type;
|
||||
readonly byte operand_type;
|
||||
readonly byte stack_behavior_pop;
|
||||
readonly byte stack_behavior_push;
|
||||
|
||||
public string Name {
|
||||
get { return OpCodeNames.names [(int) Code]; }
|
||||
}
|
||||
|
||||
public int Size {
|
||||
get { return op1 == 0xff ? 1 : 2; }
|
||||
}
|
||||
|
||||
public byte Op1 {
|
||||
get { return op1; }
|
||||
}
|
||||
|
||||
public byte Op2 {
|
||||
get { return op2; }
|
||||
}
|
||||
|
||||
public short Value {
|
||||
get { return op1 == 0xff ? op2 : (short) ((op1 << 8) | op2); }
|
||||
}
|
||||
|
||||
public Code Code {
|
||||
get { return (Code) code; }
|
||||
}
|
||||
|
||||
public FlowControl FlowControl {
|
||||
get { return (FlowControl) flow_control; }
|
||||
}
|
||||
|
||||
public OpCodeType OpCodeType {
|
||||
get { return (OpCodeType) opcode_type; }
|
||||
}
|
||||
|
||||
public OperandType OperandType {
|
||||
get { return (OperandType) operand_type; }
|
||||
}
|
||||
|
||||
public StackBehaviour StackBehaviourPop {
|
||||
get { return (StackBehaviour) stack_behavior_pop; }
|
||||
}
|
||||
|
||||
public StackBehaviour StackBehaviourPush {
|
||||
get { return (StackBehaviour) stack_behavior_push; }
|
||||
}
|
||||
|
||||
internal OpCode (int x, int y)
|
||||
{
|
||||
this.op1 = (byte) ((x >> 0) & 0xff);
|
||||
this.op2 = (byte) ((x >> 8) & 0xff);
|
||||
this.code = (byte) ((x >> 16) & 0xff);
|
||||
this.flow_control = (byte) ((x >> 24) & 0xff);
|
||||
|
||||
this.opcode_type = (byte) ((y >> 0) & 0xff);
|
||||
this.operand_type = (byte) ((y >> 8) & 0xff);
|
||||
this.stack_behavior_pop = (byte) ((y >> 16) & 0xff);
|
||||
this.stack_behavior_push = (byte) ((y >> 24) & 0xff);
|
||||
|
||||
if (op1 == 0xff)
|
||||
OpCodes.OneByteOpCode [op2] = this;
|
||||
else
|
||||
OpCodes.TwoBytesOpCode [op2] = this;
|
||||
}
|
||||
|
||||
public override int GetHashCode ()
|
||||
{
|
||||
return Value;
|
||||
}
|
||||
|
||||
public override bool Equals (object obj)
|
||||
{
|
||||
if (!(obj is OpCode))
|
||||
return false;
|
||||
|
||||
var opcode = (OpCode) obj;
|
||||
return op1 == opcode.op1 && op2 == opcode.op2;
|
||||
}
|
||||
|
||||
public bool Equals (OpCode opcode)
|
||||
{
|
||||
return op1 == opcode.op1 && op2 == opcode.op2;
|
||||
}
|
||||
|
||||
public static bool operator == (OpCode one, OpCode other)
|
||||
{
|
||||
return one.op1 == other.op1 && one.op2 == other.op2;
|
||||
}
|
||||
|
||||
public static bool operator != (OpCode one, OpCode other)
|
||||
{
|
||||
return one.op1 != other.op1 || one.op2 != other.op2;
|
||||
}
|
||||
|
||||
public override string ToString ()
|
||||
{
|
||||
return Name;
|
||||
}
|
||||
}
|
||||
|
||||
static class OpCodeNames {
|
||||
|
||||
internal static readonly string [] names;
|
||||
|
||||
static OpCodeNames ()
|
||||
{
|
||||
var table = new byte [] {
|
||||
3, 110, 111, 112,
|
||||
5, 98, 114, 101, 97, 107,
|
||||
7, 108, 100, 97, 114, 103, 46, 48,
|
||||
7, 108, 100, 97, 114, 103, 46, 49,
|
||||
7, 108, 100, 97, 114, 103, 46, 50,
|
||||
7, 108, 100, 97, 114, 103, 46, 51,
|
||||
7, 108, 100, 108, 111, 99, 46, 48,
|
||||
7, 108, 100, 108, 111, 99, 46, 49,
|
||||
7, 108, 100, 108, 111, 99, 46, 50,
|
||||
7, 108, 100, 108, 111, 99, 46, 51,
|
||||
7, 115, 116, 108, 111, 99, 46, 48,
|
||||
7, 115, 116, 108, 111, 99, 46, 49,
|
||||
7, 115, 116, 108, 111, 99, 46, 50,
|
||||
7, 115, 116, 108, 111, 99, 46, 51,
|
||||
7, 108, 100, 97, 114, 103, 46, 115,
|
||||
8, 108, 100, 97, 114, 103, 97, 46, 115,
|
||||
7, 115, 116, 97, 114, 103, 46, 115,
|
||||
7, 108, 100, 108, 111, 99, 46, 115,
|
||||
8, 108, 100, 108, 111, 99, 97, 46, 115,
|
||||
7, 115, 116, 108, 111, 99, 46, 115,
|
||||
6, 108, 100, 110, 117, 108, 108,
|
||||
9, 108, 100, 99, 46, 105, 52, 46, 109, 49,
|
||||
8, 108, 100, 99, 46, 105, 52, 46, 48,
|
||||
8, 108, 100, 99, 46, 105, 52, 46, 49,
|
||||
8, 108, 100, 99, 46, 105, 52, 46, 50,
|
||||
8, 108, 100, 99, 46, 105, 52, 46, 51,
|
||||
8, 108, 100, 99, 46, 105, 52, 46, 52,
|
||||
8, 108, 100, 99, 46, 105, 52, 46, 53,
|
||||
8, 108, 100, 99, 46, 105, 52, 46, 54,
|
||||
8, 108, 100, 99, 46, 105, 52, 46, 55,
|
||||
8, 108, 100, 99, 46, 105, 52, 46, 56,
|
||||
8, 108, 100, 99, 46, 105, 52, 46, 115,
|
||||
6, 108, 100, 99, 46, 105, 52,
|
||||
6, 108, 100, 99, 46, 105, 56,
|
||||
6, 108, 100, 99, 46, 114, 52,
|
||||
6, 108, 100, 99, 46, 114, 56,
|
||||
3, 100, 117, 112,
|
||||
3, 112, 111, 112,
|
||||
3, 106, 109, 112,
|
||||
4, 99, 97, 108, 108,
|
||||
5, 99, 97, 108, 108, 105,
|
||||
3, 114, 101, 116,
|
||||
4, 98, 114, 46, 115,
|
||||
9, 98, 114, 102, 97, 108, 115, 101, 46, 115,
|
||||
8, 98, 114, 116, 114, 117, 101, 46, 115,
|
||||
5, 98, 101, 113, 46, 115,
|
||||
5, 98, 103, 101, 46, 115,
|
||||
5, 98, 103, 116, 46, 115,
|
||||
5, 98, 108, 101, 46, 115,
|
||||
5, 98, 108, 116, 46, 115,
|
||||
8, 98, 110, 101, 46, 117, 110, 46, 115,
|
||||
8, 98, 103, 101, 46, 117, 110, 46, 115,
|
||||
8, 98, 103, 116, 46, 117, 110, 46, 115,
|
||||
8, 98, 108, 101, 46, 117, 110, 46, 115,
|
||||
8, 98, 108, 116, 46, 117, 110, 46, 115,
|
||||
2, 98, 114,
|
||||
7, 98, 114, 102, 97, 108, 115, 101,
|
||||
6, 98, 114, 116, 114, 117, 101,
|
||||
3, 98, 101, 113,
|
||||
3, 98, 103, 101,
|
||||
3, 98, 103, 116,
|
||||
3, 98, 108, 101,
|
||||
3, 98, 108, 116,
|
||||
6, 98, 110, 101, 46, 117, 110,
|
||||
6, 98, 103, 101, 46, 117, 110,
|
||||
6, 98, 103, 116, 46, 117, 110,
|
||||
6, 98, 108, 101, 46, 117, 110,
|
||||
6, 98, 108, 116, 46, 117, 110,
|
||||
6, 115, 119, 105, 116, 99, 104,
|
||||
8, 108, 100, 105, 110, 100, 46, 105, 49,
|
||||
8, 108, 100, 105, 110, 100, 46, 117, 49,
|
||||
8, 108, 100, 105, 110, 100, 46, 105, 50,
|
||||
8, 108, 100, 105, 110, 100, 46, 117, 50,
|
||||
8, 108, 100, 105, 110, 100, 46, 105, 52,
|
||||
8, 108, 100, 105, 110, 100, 46, 117, 52,
|
||||
8, 108, 100, 105, 110, 100, 46, 105, 56,
|
||||
7, 108, 100, 105, 110, 100, 46, 105,
|
||||
8, 108, 100, 105, 110, 100, 46, 114, 52,
|
||||
8, 108, 100, 105, 110, 100, 46, 114, 56,
|
||||
9, 108, 100, 105, 110, 100, 46, 114, 101, 102,
|
||||
9, 115, 116, 105, 110, 100, 46, 114, 101, 102,
|
||||
8, 115, 116, 105, 110, 100, 46, 105, 49,
|
||||
8, 115, 116, 105, 110, 100, 46, 105, 50,
|
||||
8, 115, 116, 105, 110, 100, 46, 105, 52,
|
||||
8, 115, 116, 105, 110, 100, 46, 105, 56,
|
||||
8, 115, 116, 105, 110, 100, 46, 114, 52,
|
||||
8, 115, 116, 105, 110, 100, 46, 114, 56,
|
||||
3, 97, 100, 100,
|
||||
3, 115, 117, 98,
|
||||
3, 109, 117, 108,
|
||||
3, 100, 105, 118,
|
||||
6, 100, 105, 118, 46, 117, 110,
|
||||
3, 114, 101, 109,
|
||||
6, 114, 101, 109, 46, 117, 110,
|
||||
3, 97, 110, 100,
|
||||
2, 111, 114,
|
||||
3, 120, 111, 114,
|
||||
3, 115, 104, 108,
|
||||
3, 115, 104, 114,
|
||||
6, 115, 104, 114, 46, 117, 110,
|
||||
3, 110, 101, 103,
|
||||
3, 110, 111, 116,
|
||||
7, 99, 111, 110, 118, 46, 105, 49,
|
||||
7, 99, 111, 110, 118, 46, 105, 50,
|
||||
7, 99, 111, 110, 118, 46, 105, 52,
|
||||
7, 99, 111, 110, 118, 46, 105, 56,
|
||||
7, 99, 111, 110, 118, 46, 114, 52,
|
||||
7, 99, 111, 110, 118, 46, 114, 56,
|
||||
7, 99, 111, 110, 118, 46, 117, 52,
|
||||
7, 99, 111, 110, 118, 46, 117, 56,
|
||||
8, 99, 97, 108, 108, 118, 105, 114, 116,
|
||||
5, 99, 112, 111, 98, 106,
|
||||
5, 108, 100, 111, 98, 106,
|
||||
5, 108, 100, 115, 116, 114,
|
||||
6, 110, 101, 119, 111, 98, 106,
|
||||
9, 99, 97, 115, 116, 99, 108, 97, 115, 115,
|
||||
6, 105, 115, 105, 110, 115, 116,
|
||||
9, 99, 111, 110, 118, 46, 114, 46, 117, 110,
|
||||
5, 117, 110, 98, 111, 120,
|
||||
5, 116, 104, 114, 111, 119,
|
||||
5, 108, 100, 102, 108, 100,
|
||||
6, 108, 100, 102, 108, 100, 97,
|
||||
5, 115, 116, 102, 108, 100,
|
||||
6, 108, 100, 115, 102, 108, 100,
|
||||
7, 108, 100, 115, 102, 108, 100, 97,
|
||||
6, 115, 116, 115, 102, 108, 100,
|
||||
5, 115, 116, 111, 98, 106,
|
||||
14, 99, 111, 110, 118, 46, 111, 118, 102, 46, 105, 49, 46, 117, 110,
|
||||
14, 99, 111, 110, 118, 46, 111, 118, 102, 46, 105, 50, 46, 117, 110,
|
||||
14, 99, 111, 110, 118, 46, 111, 118, 102, 46, 105, 52, 46, 117, 110,
|
||||
14, 99, 111, 110, 118, 46, 111, 118, 102, 46, 105, 56, 46, 117, 110,
|
||||
14, 99, 111, 110, 118, 46, 111, 118, 102, 46, 117, 49, 46, 117, 110,
|
||||
14, 99, 111, 110, 118, 46, 111, 118, 102, 46, 117, 50, 46, 117, 110,
|
||||
14, 99, 111, 110, 118, 46, 111, 118, 102, 46, 117, 52, 46, 117, 110,
|
||||
14, 99, 111, 110, 118, 46, 111, 118, 102, 46, 117, 56, 46, 117, 110,
|
||||
13, 99, 111, 110, 118, 46, 111, 118, 102, 46, 105, 46, 117, 110,
|
||||
13, 99, 111, 110, 118, 46, 111, 118, 102, 46, 117, 46, 117, 110,
|
||||
3, 98, 111, 120,
|
||||
6, 110, 101, 119, 97, 114, 114,
|
||||
5, 108, 100, 108, 101, 110,
|
||||
7, 108, 100, 101, 108, 101, 109, 97,
|
||||
9, 108, 100, 101, 108, 101, 109, 46, 105, 49,
|
||||
9, 108, 100, 101, 108, 101, 109, 46, 117, 49,
|
||||
9, 108, 100, 101, 108, 101, 109, 46, 105, 50,
|
||||
9, 108, 100, 101, 108, 101, 109, 46, 117, 50,
|
||||
9, 108, 100, 101, 108, 101, 109, 46, 105, 52,
|
||||
9, 108, 100, 101, 108, 101, 109, 46, 117, 52,
|
||||
9, 108, 100, 101, 108, 101, 109, 46, 105, 56,
|
||||
8, 108, 100, 101, 108, 101, 109, 46, 105,
|
||||
9, 108, 100, 101, 108, 101, 109, 46, 114, 52,
|
||||
9, 108, 100, 101, 108, 101, 109, 46, 114, 56,
|
||||
10, 108, 100, 101, 108, 101, 109, 46, 114, 101, 102,
|
||||
8, 115, 116, 101, 108, 101, 109, 46, 105,
|
||||
9, 115, 116, 101, 108, 101, 109, 46, 105, 49,
|
||||
9, 115, 116, 101, 108, 101, 109, 46, 105, 50,
|
||||
9, 115, 116, 101, 108, 101, 109, 46, 105, 52,
|
||||
9, 115, 116, 101, 108, 101, 109, 46, 105, 56,
|
||||
9, 115, 116, 101, 108, 101, 109, 46, 114, 52,
|
||||
9, 115, 116, 101, 108, 101, 109, 46, 114, 56,
|
||||
10, 115, 116, 101, 108, 101, 109, 46, 114, 101, 102,
|
||||
10, 108, 100, 101, 108, 101, 109, 46, 97, 110, 121,
|
||||
10, 115, 116, 101, 108, 101, 109, 46, 97, 110, 121,
|
||||
9, 117, 110, 98, 111, 120, 46, 97, 110, 121,
|
||||
11, 99, 111, 110, 118, 46, 111, 118, 102, 46, 105, 49,
|
||||
11, 99, 111, 110, 118, 46, 111, 118, 102, 46, 117, 49,
|
||||
11, 99, 111, 110, 118, 46, 111, 118, 102, 46, 105, 50,
|
||||
11, 99, 111, 110, 118, 46, 111, 118, 102, 46, 117, 50,
|
||||
11, 99, 111, 110, 118, 46, 111, 118, 102, 46, 105, 52,
|
||||
11, 99, 111, 110, 118, 46, 111, 118, 102, 46, 117, 52,
|
||||
11, 99, 111, 110, 118, 46, 111, 118, 102, 46, 105, 56,
|
||||
11, 99, 111, 110, 118, 46, 111, 118, 102, 46, 117, 56,
|
||||
9, 114, 101, 102, 97, 110, 121, 118, 97, 108,
|
||||
8, 99, 107, 102, 105, 110, 105, 116, 101,
|
||||
8, 109, 107, 114, 101, 102, 97, 110, 121,
|
||||
7, 108, 100, 116, 111, 107, 101, 110,
|
||||
7, 99, 111, 110, 118, 46, 117, 50,
|
||||
7, 99, 111, 110, 118, 46, 117, 49,
|
||||
6, 99, 111, 110, 118, 46, 105,
|
||||
10, 99, 111, 110, 118, 46, 111, 118, 102, 46, 105,
|
||||
10, 99, 111, 110, 118, 46, 111, 118, 102, 46, 117,
|
||||
7, 97, 100, 100, 46, 111, 118, 102,
|
||||
10, 97, 100, 100, 46, 111, 118, 102, 46, 117, 110,
|
||||
7, 109, 117, 108, 46, 111, 118, 102,
|
||||
10, 109, 117, 108, 46, 111, 118, 102, 46, 117, 110,
|
||||
7, 115, 117, 98, 46, 111, 118, 102,
|
||||
10, 115, 117, 98, 46, 111, 118, 102, 46, 117, 110,
|
||||
10, 101, 110, 100, 102, 105, 110, 97, 108, 108, 121,
|
||||
5, 108, 101, 97, 118, 101,
|
||||
7, 108, 101, 97, 118, 101, 46, 115,
|
||||
7, 115, 116, 105, 110, 100, 46, 105,
|
||||
6, 99, 111, 110, 118, 46, 117,
|
||||
7, 97, 114, 103, 108, 105, 115, 116,
|
||||
3, 99, 101, 113,
|
||||
3, 99, 103, 116,
|
||||
6, 99, 103, 116, 46, 117, 110,
|
||||
3, 99, 108, 116,
|
||||
6, 99, 108, 116, 46, 117, 110,
|
||||
5, 108, 100, 102, 116, 110,
|
||||
9, 108, 100, 118, 105, 114, 116, 102, 116, 110,
|
||||
5, 108, 100, 97, 114, 103,
|
||||
6, 108, 100, 97, 114, 103, 97,
|
||||
5, 115, 116, 97, 114, 103,
|
||||
5, 108, 100, 108, 111, 99,
|
||||
6, 108, 100, 108, 111, 99, 97,
|
||||
5, 115, 116, 108, 111, 99,
|
||||
8, 108, 111, 99, 97, 108, 108, 111, 99,
|
||||
9, 101, 110, 100, 102, 105, 108, 116, 101, 114,
|
||||
10, 117, 110, 97, 108, 105, 103, 110, 101, 100, 46,
|
||||
9, 118, 111, 108, 97, 116, 105, 108, 101, 46,
|
||||
5, 116, 97, 105, 108, 46,
|
||||
7, 105, 110, 105, 116, 111, 98, 106,
|
||||
12, 99, 111, 110, 115, 116, 114, 97, 105, 110, 101, 100, 46,
|
||||
5, 99, 112, 98, 108, 107,
|
||||
7, 105, 110, 105, 116, 98, 108, 107,
|
||||
3, 110, 111, 46,
|
||||
7, 114, 101, 116, 104, 114, 111, 119,
|
||||
6, 115, 105, 122, 101, 111, 102,
|
||||
10, 114, 101, 102, 97, 110, 121, 116, 121, 112, 101,
|
||||
9, 114, 101, 97, 100, 111, 110, 108, 121, 46,
|
||||
};
|
||||
|
||||
names = new string [219];
|
||||
|
||||
for (int i = 0, p = 0; i < names.Length; i++) {
|
||||
var buffer = new char [table [p++]];
|
||||
|
||||
for (int j = 0; j < buffer.Length; j++)
|
||||
buffer [j] = (char) table [p++];
|
||||
|
||||
names [i] = new string (buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
894
external/linker/cecil/Mono.Cecil.Cil/OpCodes.cs
vendored
Normal file
894
external/linker/cecil/Mono.Cecil.Cil/OpCodes.cs
vendored
Normal file
File diff suppressed because it is too large
Load Diff
409
external/linker/cecil/Mono.Cecil.Cil/PortablePdb.cs
vendored
Normal file
409
external/linker/cecil/Mono.Cecil.Cil/PortablePdb.cs
vendored
Normal file
@@ -0,0 +1,409 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
||||
using Mono.Cecil.Metadata;
|
||||
using Mono.Cecil.PE;
|
||||
|
||||
namespace Mono.Cecil.Cil {
|
||||
|
||||
public sealed class PortablePdbReaderProvider : ISymbolReaderProvider {
|
||||
|
||||
#if !PCL
|
||||
public ISymbolReader GetSymbolReader (ModuleDefinition module, string fileName)
|
||||
{
|
||||
Mixin.CheckModule (module);
|
||||
Mixin.CheckFileName (fileName);
|
||||
|
||||
var file = File.OpenRead (Mixin.GetPdbFileName (fileName));
|
||||
return GetSymbolReader (module, Disposable.Owned (file as Stream), file.Name);
|
||||
}
|
||||
#endif
|
||||
|
||||
public ISymbolReader GetSymbolReader (ModuleDefinition module, Stream symbolStream)
|
||||
{
|
||||
Mixin.CheckModule (module);
|
||||
Mixin.CheckStream (symbolStream);
|
||||
|
||||
return GetSymbolReader (module, Disposable.NotOwned (symbolStream), "");
|
||||
}
|
||||
|
||||
ISymbolReader GetSymbolReader (ModuleDefinition module, Disposable<Stream> symbolStream, string fileName)
|
||||
{
|
||||
return new PortablePdbReader (ImageReader.ReadPortablePdb (symbolStream, fileName), module);
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class PortablePdbReader : ISymbolReader {
|
||||
|
||||
readonly Image image;
|
||||
readonly ModuleDefinition module;
|
||||
readonly MetadataReader reader;
|
||||
readonly MetadataReader debug_reader;
|
||||
|
||||
bool IsEmbedded { get { return reader.image == debug_reader.image; } }
|
||||
|
||||
internal PortablePdbReader (Image image, ModuleDefinition module)
|
||||
{
|
||||
this.image = image;
|
||||
this.module = module;
|
||||
this.reader = module.reader;
|
||||
this.debug_reader = new MetadataReader (image, module, this.reader);
|
||||
}
|
||||
|
||||
public bool ProcessDebugHeader (ImageDebugDirectory directory, byte [] header)
|
||||
{
|
||||
if (image == module.Image)
|
||||
return true;
|
||||
|
||||
if (header.Length < 24)
|
||||
return false;
|
||||
|
||||
var magic = ReadInt32 (header, 0);
|
||||
if (magic != 0x53445352)
|
||||
return false;
|
||||
|
||||
var buffer = new byte [16];
|
||||
Buffer.BlockCopy (header, 4, buffer, 0, 16);
|
||||
|
||||
var module_guid = new Guid (buffer);
|
||||
|
||||
Buffer.BlockCopy (image.PdbHeap.Id, 0, buffer, 0, 16);
|
||||
|
||||
var pdb_guid = new Guid (buffer);
|
||||
|
||||
return module_guid == pdb_guid;
|
||||
}
|
||||
|
||||
static int ReadInt32 (byte [] bytes, int start)
|
||||
{
|
||||
return (bytes [start]
|
||||
| (bytes [start + 1] << 8)
|
||||
| (bytes [start + 2] << 16)
|
||||
| (bytes [start + 3] << 24));
|
||||
}
|
||||
|
||||
public MethodDebugInformation Read (MethodDefinition method)
|
||||
{
|
||||
var info = new MethodDebugInformation (method);
|
||||
ReadSequencePoints (info);
|
||||
ReadScope (info);
|
||||
ReadStateMachineKickOffMethod (info);
|
||||
ReadCustomDebugInformations (info);
|
||||
return info;
|
||||
}
|
||||
|
||||
void ReadSequencePoints (MethodDebugInformation method_info)
|
||||
{
|
||||
method_info.sequence_points = debug_reader.ReadSequencePoints (method_info.method);
|
||||
}
|
||||
|
||||
void ReadScope (MethodDebugInformation method_info)
|
||||
{
|
||||
method_info.scope = debug_reader.ReadScope (method_info.method);
|
||||
}
|
||||
|
||||
void ReadStateMachineKickOffMethod (MethodDebugInformation method_info)
|
||||
{
|
||||
method_info.kickoff_method = debug_reader.ReadStateMachineKickoffMethod (method_info.method);
|
||||
}
|
||||
|
||||
void ReadCustomDebugInformations (MethodDebugInformation info)
|
||||
{
|
||||
info.method.custom_infos = debug_reader.GetCustomDebugInformation (info.method);
|
||||
}
|
||||
|
||||
public void Dispose ()
|
||||
{
|
||||
if (IsEmbedded)
|
||||
return;
|
||||
|
||||
image.Dispose ();
|
||||
}
|
||||
}
|
||||
|
||||
#if !READ_ONLY
|
||||
|
||||
public sealed class PortablePdbWriterProvider : ISymbolWriterProvider
|
||||
{
|
||||
#if !PCL
|
||||
public ISymbolWriter GetSymbolWriter (ModuleDefinition module, string fileName)
|
||||
{
|
||||
Mixin.CheckModule (module);
|
||||
Mixin.CheckFileName (fileName);
|
||||
|
||||
var file = File.OpenWrite (Mixin.GetPdbFileName (fileName));
|
||||
return GetSymbolWriter (module, Disposable.Owned (file as Stream));
|
||||
}
|
||||
#endif
|
||||
|
||||
public ISymbolWriter GetSymbolWriter (ModuleDefinition module, Stream symbolStream)
|
||||
{
|
||||
Mixin.CheckModule (module);
|
||||
Mixin.CheckStream (symbolStream);
|
||||
|
||||
return GetSymbolWriter (module, Disposable.NotOwned (symbolStream));
|
||||
}
|
||||
|
||||
ISymbolWriter GetSymbolWriter (ModuleDefinition module, Disposable<Stream> stream)
|
||||
{
|
||||
var metadata = new MetadataBuilder (module, this);
|
||||
var writer = ImageWriter.CreateDebugWriter (module, metadata, stream);
|
||||
|
||||
return new PortablePdbWriter (metadata, module, writer);
|
||||
}
|
||||
}
|
||||
|
||||
sealed class PortablePdbWriter : ISymbolWriter {
|
||||
|
||||
readonly MetadataBuilder pdb_metadata;
|
||||
readonly ModuleDefinition module;
|
||||
readonly ImageWriter writer;
|
||||
|
||||
MetadataBuilder module_metadata;
|
||||
|
||||
bool IsEmbedded { get { return writer == null; } }
|
||||
|
||||
public PortablePdbWriter (MetadataBuilder pdb_metadata, ModuleDefinition module)
|
||||
{
|
||||
this.pdb_metadata = pdb_metadata;
|
||||
this.module = module;
|
||||
}
|
||||
|
||||
public PortablePdbWriter (MetadataBuilder pdb_metadata, ModuleDefinition module, ImageWriter writer)
|
||||
: this (pdb_metadata, module)
|
||||
{
|
||||
this.writer = writer;
|
||||
}
|
||||
|
||||
public void SetModuleMetadata (MetadataBuilder metadata)
|
||||
{
|
||||
this.module_metadata = metadata;
|
||||
|
||||
if (module_metadata != pdb_metadata)
|
||||
this.pdb_metadata.metadata_builder = metadata;
|
||||
}
|
||||
|
||||
public bool GetDebugHeader (out ImageDebugDirectory directory, out byte [] header)
|
||||
{
|
||||
if (IsEmbedded) {
|
||||
directory = new ImageDebugDirectory ();
|
||||
header = Empty<byte>.Array;
|
||||
return false;
|
||||
}
|
||||
|
||||
directory = new ImageDebugDirectory () {
|
||||
MajorVersion = 256,
|
||||
MinorVersion = 20577,
|
||||
Type = 2,
|
||||
};
|
||||
|
||||
var buffer = new ByteBuffer ();
|
||||
// RSDS
|
||||
buffer.WriteUInt32 (0x53445352);
|
||||
// Module ID
|
||||
buffer.WriteBytes (module.Mvid.ToByteArray ());
|
||||
// PDB Age
|
||||
buffer.WriteUInt32 (1);
|
||||
// PDB Path
|
||||
buffer.WriteBytes (System.Text.Encoding.UTF8.GetBytes (writer.BaseStream.GetFileName ()));
|
||||
buffer.WriteByte (0);
|
||||
|
||||
header = new byte [buffer.length];
|
||||
Buffer.BlockCopy (buffer.buffer, 0, header, 0, buffer.length);
|
||||
directory.SizeOfData = header.Length;
|
||||
return true;
|
||||
}
|
||||
|
||||
public void Write (MethodDebugInformation info)
|
||||
{
|
||||
CheckMethodDebugInformationTable ();
|
||||
|
||||
pdb_metadata.AddMethodDebugInformation (info);
|
||||
}
|
||||
|
||||
void CheckMethodDebugInformationTable ()
|
||||
{
|
||||
var mdi = pdb_metadata.table_heap.GetTable<MethodDebugInformationTable> (Table.MethodDebugInformation);
|
||||
if (mdi.length > 0)
|
||||
return;
|
||||
|
||||
// The MethodDebugInformation table has the same length as the Method table
|
||||
mdi.rows = new Row<uint, uint> [module_metadata.method_rid - 1];
|
||||
mdi.length = mdi.rows.Length;
|
||||
}
|
||||
|
||||
public void Dispose ()
|
||||
{
|
||||
if (IsEmbedded)
|
||||
return;
|
||||
|
||||
WritePdbHeap ();
|
||||
WriteTableHeap ();
|
||||
|
||||
writer.BuildMetadataTextMap ();
|
||||
writer.WriteMetadataHeader ();
|
||||
writer.WriteMetadata ();
|
||||
|
||||
writer.stream.Dispose ();
|
||||
}
|
||||
|
||||
void WritePdbHeap ()
|
||||
{
|
||||
var pdb_heap = pdb_metadata.pdb_heap;
|
||||
|
||||
pdb_heap.WriteBytes (module.Mvid.ToByteArray ());
|
||||
pdb_heap.WriteUInt32 (module_metadata.time_stamp);
|
||||
|
||||
pdb_heap.WriteUInt32 (module_metadata.entry_point.ToUInt32 ());
|
||||
|
||||
var table_heap = module_metadata.table_heap;
|
||||
var tables = table_heap.tables;
|
||||
|
||||
ulong valid = 0;
|
||||
for (int i = 0; i < tables.Length; i++) {
|
||||
if (tables [i] == null || tables [i].Length == 0)
|
||||
continue;
|
||||
|
||||
valid |= (1UL << i);
|
||||
}
|
||||
|
||||
pdb_heap.WriteUInt64 (valid);
|
||||
|
||||
for (int i = 0; i < tables.Length; i++) {
|
||||
if (tables [i] == null || tables [i].Length == 0)
|
||||
continue;
|
||||
|
||||
pdb_heap.WriteUInt32 ((uint) tables [i].Length);
|
||||
}
|
||||
}
|
||||
|
||||
void WriteTableHeap ()
|
||||
{
|
||||
pdb_metadata.table_heap.WriteTableHeap ();
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static class PdbGuidMapping {
|
||||
|
||||
static readonly Dictionary<Guid, DocumentLanguage> guid_language = new Dictionary<Guid, DocumentLanguage> ();
|
||||
static readonly Dictionary<DocumentLanguage, Guid> language_guid = new Dictionary<DocumentLanguage, Guid> ();
|
||||
|
||||
static PdbGuidMapping ()
|
||||
{
|
||||
AddMapping (DocumentLanguage.C, new Guid ("63a08714-fc37-11d2-904c-00c04fa302a1"));
|
||||
AddMapping (DocumentLanguage.Cpp, new Guid ("3a12d0b7-c26c-11d0-b442-00a0244a1dd2"));
|
||||
AddMapping (DocumentLanguage.CSharp, new Guid ("3f5162f8-07c6-11d3-9053-00c04fa302a1"));
|
||||
AddMapping (DocumentLanguage.Basic, new Guid ("3a12d0b8-c26c-11d0-b442-00a0244a1dd2"));
|
||||
AddMapping (DocumentLanguage.Java, new Guid ("3a12d0b4-c26c-11d0-b442-00a0244a1dd2"));
|
||||
AddMapping (DocumentLanguage.Cobol, new Guid ("af046cd1-d0e1-11d2-977c-00a0c9b4d50c"));
|
||||
AddMapping (DocumentLanguage.Pascal, new Guid ("af046cd2-d0e1-11d2-977c-00a0c9b4d50c"));
|
||||
AddMapping (DocumentLanguage.Cil, new Guid ("af046cd3-d0e1-11d2-977c-00a0c9b4d50c"));
|
||||
AddMapping (DocumentLanguage.JScript, new Guid ("3a12d0b6-c26c-11d0-b442-00a0244a1dd2"));
|
||||
AddMapping (DocumentLanguage.Smc, new Guid ("0d9b9f7b-6611-11d3-bd2a-0000f80849bd"));
|
||||
AddMapping (DocumentLanguage.MCpp, new Guid ("4b35fde8-07c6-11d3-9053-00c04fa302a1"));
|
||||
AddMapping (DocumentLanguage.FSharp, new Guid ("ab4f38c9-b6e6-43ba-be3b-58080b2ccce3"));
|
||||
}
|
||||
|
||||
static void AddMapping (DocumentLanguage language, Guid guid)
|
||||
{
|
||||
guid_language.Add (guid, language);
|
||||
language_guid.Add (language, guid);
|
||||
}
|
||||
|
||||
static readonly Guid type_text = new Guid ("5a869d0b-6611-11d3-bd2a-0000f80849bd");
|
||||
|
||||
public static DocumentType ToType (this Guid guid)
|
||||
{
|
||||
if (guid == type_text)
|
||||
return DocumentType.Text;
|
||||
|
||||
return DocumentType.Other;
|
||||
}
|
||||
|
||||
public static Guid ToGuid (this DocumentType type)
|
||||
{
|
||||
if (type == DocumentType.Text)
|
||||
return type_text;
|
||||
|
||||
return new Guid ();
|
||||
}
|
||||
|
||||
static readonly Guid hash_md5 = new Guid ("406ea660-64cf-4c82-b6f0-42d48172a799");
|
||||
static readonly Guid hash_sha1 = new Guid ("ff1816ec-aa5e-4d10-87f7-6f4963833460");
|
||||
static readonly Guid hash_sha256 = new Guid ("8829d00f-11b8-4213-878b-770e8597ac16");
|
||||
|
||||
public static DocumentHashAlgorithm ToHashAlgorithm (this Guid guid)
|
||||
{
|
||||
if (guid == hash_md5)
|
||||
return DocumentHashAlgorithm.MD5;
|
||||
|
||||
if (guid == hash_sha1)
|
||||
return DocumentHashAlgorithm.SHA1;
|
||||
|
||||
if (guid == hash_sha256)
|
||||
return DocumentHashAlgorithm.SHA256;
|
||||
|
||||
return DocumentHashAlgorithm.None;
|
||||
}
|
||||
|
||||
public static Guid ToGuid (this DocumentHashAlgorithm hash_algo)
|
||||
{
|
||||
if (hash_algo == DocumentHashAlgorithm.MD5)
|
||||
return hash_md5;
|
||||
|
||||
if (hash_algo == DocumentHashAlgorithm.SHA1)
|
||||
return hash_sha1;
|
||||
|
||||
return new Guid ();
|
||||
}
|
||||
|
||||
public static DocumentLanguage ToLanguage (this Guid guid)
|
||||
{
|
||||
DocumentLanguage language;
|
||||
if (!guid_language.TryGetValue (guid, out language))
|
||||
return DocumentLanguage.Other;
|
||||
|
||||
return language;
|
||||
}
|
||||
|
||||
public static Guid ToGuid (this DocumentLanguage language)
|
||||
{
|
||||
Guid guid;
|
||||
if (!language_guid.TryGetValue (language, out guid))
|
||||
return new Guid ();
|
||||
|
||||
return guid;
|
||||
}
|
||||
|
||||
static readonly Guid vendor_ms = new Guid ("994b45c4-e6e9-11d2-903f-00c04fa302a1");
|
||||
|
||||
public static DocumentLanguageVendor ToVendor (this Guid guid)
|
||||
{
|
||||
if (guid == vendor_ms)
|
||||
return DocumentLanguageVendor.Microsoft;
|
||||
|
||||
return DocumentLanguageVendor.Other;
|
||||
}
|
||||
|
||||
public static Guid ToGuid (this DocumentLanguageVendor vendor)
|
||||
{
|
||||
if (vendor == DocumentLanguageVendor.Microsoft)
|
||||
return vendor_ms;
|
||||
|
||||
return new Guid ();
|
||||
}
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user