asmjit 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/asmjit.gemspec +1 -1
- data/ext/asmjit/asmjit/.editorconfig +10 -0
- data/ext/asmjit/asmjit/.github/FUNDING.yml +1 -0
- data/ext/asmjit/asmjit/.github/workflows/build-config.json +47 -0
- data/ext/asmjit/asmjit/.github/workflows/build.yml +156 -0
- data/ext/asmjit/asmjit/.gitignore +6 -0
- data/ext/asmjit/asmjit/CMakeLists.txt +611 -0
- data/ext/asmjit/asmjit/LICENSE.md +17 -0
- data/ext/asmjit/asmjit/README.md +69 -0
- data/ext/asmjit/asmjit/src/asmjit/a64.h +62 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64archtraits_p.h +81 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64assembler.cpp +5115 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64assembler.h +72 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64builder.cpp +51 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64builder.h +57 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64compiler.cpp +60 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64compiler.h +247 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64emithelper.cpp +464 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64emithelper_p.h +50 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64emitter.h +1228 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64formatter.cpp +298 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64formatter_p.h +59 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64func.cpp +189 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64func_p.h +33 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64globals.h +1894 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64instapi.cpp +278 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64instapi_p.h +41 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64instdb.cpp +1957 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64instdb.h +74 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64instdb_p.h +876 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64operand.cpp +85 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64operand.h +312 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64rapass.cpp +852 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64rapass_p.h +105 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64utils.h +179 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/armformatter.cpp +143 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/armformatter_p.h +44 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/armglobals.h +21 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/armoperand.h +621 -0
- data/ext/asmjit/asmjit/src/asmjit/arm.h +62 -0
- data/ext/asmjit/asmjit/src/asmjit/asmjit-scope-begin.h +17 -0
- data/ext/asmjit/asmjit/src/asmjit/asmjit-scope-end.h +9 -0
- data/ext/asmjit/asmjit/src/asmjit/asmjit.h +33 -0
- data/ext/asmjit/asmjit/src/asmjit/core/api-build_p.h +55 -0
- data/ext/asmjit/asmjit/src/asmjit/core/api-config.h +613 -0
- data/ext/asmjit/asmjit/src/asmjit/core/archcommons.h +229 -0
- data/ext/asmjit/asmjit/src/asmjit/core/archtraits.cpp +160 -0
- data/ext/asmjit/asmjit/src/asmjit/core/archtraits.h +290 -0
- data/ext/asmjit/asmjit/src/asmjit/core/assembler.cpp +406 -0
- data/ext/asmjit/asmjit/src/asmjit/core/assembler.h +129 -0
- data/ext/asmjit/asmjit/src/asmjit/core/builder.cpp +889 -0
- data/ext/asmjit/asmjit/src/asmjit/core/builder.h +1391 -0
- data/ext/asmjit/asmjit/src/asmjit/core/codebuffer.h +113 -0
- data/ext/asmjit/asmjit/src/asmjit/core/codeholder.cpp +1149 -0
- data/ext/asmjit/asmjit/src/asmjit/core/codeholder.h +1035 -0
- data/ext/asmjit/asmjit/src/asmjit/core/codewriter.cpp +175 -0
- data/ext/asmjit/asmjit/src/asmjit/core/codewriter_p.h +179 -0
- data/ext/asmjit/asmjit/src/asmjit/core/compiler.cpp +582 -0
- data/ext/asmjit/asmjit/src/asmjit/core/compiler.h +737 -0
- data/ext/asmjit/asmjit/src/asmjit/core/compilerdefs.h +173 -0
- data/ext/asmjit/asmjit/src/asmjit/core/constpool.cpp +363 -0
- data/ext/asmjit/asmjit/src/asmjit/core/constpool.h +250 -0
- data/ext/asmjit/asmjit/src/asmjit/core/cpuinfo.cpp +1162 -0
- data/ext/asmjit/asmjit/src/asmjit/core/cpuinfo.h +813 -0
- data/ext/asmjit/asmjit/src/asmjit/core/emithelper.cpp +323 -0
- data/ext/asmjit/asmjit/src/asmjit/core/emithelper_p.h +58 -0
- data/ext/asmjit/asmjit/src/asmjit/core/emitter.cpp +333 -0
- data/ext/asmjit/asmjit/src/asmjit/core/emitter.h +741 -0
- data/ext/asmjit/asmjit/src/asmjit/core/emitterutils.cpp +129 -0
- data/ext/asmjit/asmjit/src/asmjit/core/emitterutils_p.h +89 -0
- data/ext/asmjit/asmjit/src/asmjit/core/environment.cpp +46 -0
- data/ext/asmjit/asmjit/src/asmjit/core/environment.h +508 -0
- data/ext/asmjit/asmjit/src/asmjit/core/errorhandler.cpp +14 -0
- data/ext/asmjit/asmjit/src/asmjit/core/errorhandler.h +228 -0
- data/ext/asmjit/asmjit/src/asmjit/core/formatter.cpp +584 -0
- data/ext/asmjit/asmjit/src/asmjit/core/formatter.h +247 -0
- data/ext/asmjit/asmjit/src/asmjit/core/formatter_p.h +34 -0
- data/ext/asmjit/asmjit/src/asmjit/core/func.cpp +286 -0
- data/ext/asmjit/asmjit/src/asmjit/core/func.h +1445 -0
- data/ext/asmjit/asmjit/src/asmjit/core/funcargscontext.cpp +293 -0
- data/ext/asmjit/asmjit/src/asmjit/core/funcargscontext_p.h +199 -0
- data/ext/asmjit/asmjit/src/asmjit/core/globals.cpp +133 -0
- data/ext/asmjit/asmjit/src/asmjit/core/globals.h +393 -0
- data/ext/asmjit/asmjit/src/asmjit/core/inst.cpp +113 -0
- data/ext/asmjit/asmjit/src/asmjit/core/inst.h +772 -0
- data/ext/asmjit/asmjit/src/asmjit/core/jitallocator.cpp +1242 -0
- data/ext/asmjit/asmjit/src/asmjit/core/jitallocator.h +261 -0
- data/ext/asmjit/asmjit/src/asmjit/core/jitruntime.cpp +80 -0
- data/ext/asmjit/asmjit/src/asmjit/core/jitruntime.h +89 -0
- data/ext/asmjit/asmjit/src/asmjit/core/logger.cpp +69 -0
- data/ext/asmjit/asmjit/src/asmjit/core/logger.h +198 -0
- data/ext/asmjit/asmjit/src/asmjit/core/misc_p.h +33 -0
- data/ext/asmjit/asmjit/src/asmjit/core/operand.cpp +132 -0
- data/ext/asmjit/asmjit/src/asmjit/core/operand.h +1611 -0
- data/ext/asmjit/asmjit/src/asmjit/core/osutils.cpp +84 -0
- data/ext/asmjit/asmjit/src/asmjit/core/osutils.h +61 -0
- data/ext/asmjit/asmjit/src/asmjit/core/osutils_p.h +68 -0
- data/ext/asmjit/asmjit/src/asmjit/core/raassignment_p.h +418 -0
- data/ext/asmjit/asmjit/src/asmjit/core/rabuilders_p.h +612 -0
- data/ext/asmjit/asmjit/src/asmjit/core/radefs_p.h +1204 -0
- data/ext/asmjit/asmjit/src/asmjit/core/ralocal.cpp +1166 -0
- data/ext/asmjit/asmjit/src/asmjit/core/ralocal_p.h +254 -0
- data/ext/asmjit/asmjit/src/asmjit/core/rapass.cpp +1969 -0
- data/ext/asmjit/asmjit/src/asmjit/core/rapass_p.h +1183 -0
- data/ext/asmjit/asmjit/src/asmjit/core/rastack.cpp +184 -0
- data/ext/asmjit/asmjit/src/asmjit/core/rastack_p.h +171 -0
- data/ext/asmjit/asmjit/src/asmjit/core/string.cpp +559 -0
- data/ext/asmjit/asmjit/src/asmjit/core/string.h +372 -0
- data/ext/asmjit/asmjit/src/asmjit/core/support.cpp +494 -0
- data/ext/asmjit/asmjit/src/asmjit/core/support.h +1773 -0
- data/ext/asmjit/asmjit/src/asmjit/core/target.cpp +14 -0
- data/ext/asmjit/asmjit/src/asmjit/core/target.h +53 -0
- data/ext/asmjit/asmjit/src/asmjit/core/type.cpp +74 -0
- data/ext/asmjit/asmjit/src/asmjit/core/type.h +419 -0
- data/ext/asmjit/asmjit/src/asmjit/core/virtmem.cpp +722 -0
- data/ext/asmjit/asmjit/src/asmjit/core/virtmem.h +242 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zone.cpp +353 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zone.h +615 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonehash.cpp +309 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonehash.h +186 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonelist.cpp +163 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonelist.h +209 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonestack.cpp +176 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonestack.h +239 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonestring.h +120 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonetree.cpp +99 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonetree.h +380 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonevector.cpp +356 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonevector.h +690 -0
- data/ext/asmjit/asmjit/src/asmjit/core.h +1861 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86archtraits_p.h +148 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86assembler.cpp +5110 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86assembler.h +685 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86builder.cpp +52 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86builder.h +351 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86compiler.cpp +61 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86compiler.h +721 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86emithelper.cpp +619 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86emithelper_p.h +60 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86emitter.h +4315 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86formatter.cpp +944 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86formatter_p.h +58 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86func.cpp +503 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86func_p.h +33 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86globals.h +2169 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86instapi.cpp +1732 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86instapi_p.h +41 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86instdb.cpp +4427 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86instdb.h +563 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86instdb_p.h +311 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86opcode_p.h +436 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86operand.cpp +231 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86operand.h +1085 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86rapass.cpp +1509 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86rapass_p.h +94 -0
- data/ext/asmjit/asmjit/src/asmjit/x86.h +93 -0
- data/ext/asmjit/asmjit/src/asmjit.natvis +245 -0
- data/ext/asmjit/asmjit/test/asmjit_test_assembler.cpp +84 -0
- data/ext/asmjit/asmjit/test/asmjit_test_assembler.h +85 -0
- data/ext/asmjit/asmjit/test/asmjit_test_assembler_a64.cpp +4006 -0
- data/ext/asmjit/asmjit/test/asmjit_test_assembler_x64.cpp +17833 -0
- data/ext/asmjit/asmjit/test/asmjit_test_assembler_x86.cpp +8300 -0
- data/ext/asmjit/asmjit/test/asmjit_test_compiler.cpp +253 -0
- data/ext/asmjit/asmjit/test/asmjit_test_compiler.h +73 -0
- data/ext/asmjit/asmjit/test/asmjit_test_compiler_a64.cpp +690 -0
- data/ext/asmjit/asmjit/test/asmjit_test_compiler_x86.cpp +4317 -0
- data/ext/asmjit/asmjit/test/asmjit_test_emitters.cpp +197 -0
- data/ext/asmjit/asmjit/test/asmjit_test_instinfo.cpp +181 -0
- data/ext/asmjit/asmjit/test/asmjit_test_misc.h +257 -0
- data/ext/asmjit/asmjit/test/asmjit_test_perf.cpp +62 -0
- data/ext/asmjit/asmjit/test/asmjit_test_perf.h +61 -0
- data/ext/asmjit/asmjit/test/asmjit_test_perf_a64.cpp +699 -0
- data/ext/asmjit/asmjit/test/asmjit_test_perf_x86.cpp +5032 -0
- data/ext/asmjit/asmjit/test/asmjit_test_unit.cpp +172 -0
- data/ext/asmjit/asmjit/test/asmjit_test_x86_sections.cpp +172 -0
- data/ext/asmjit/asmjit/test/asmjitutils.h +38 -0
- data/ext/asmjit/asmjit/test/broken.cpp +312 -0
- data/ext/asmjit/asmjit/test/broken.h +148 -0
- data/ext/asmjit/asmjit/test/cmdline.h +61 -0
- data/ext/asmjit/asmjit/test/performancetimer.h +41 -0
- data/ext/asmjit/asmjit/tools/configure-makefiles.sh +13 -0
- data/ext/asmjit/asmjit/tools/configure-ninja.sh +13 -0
- data/ext/asmjit/asmjit/tools/configure-sanitizers.sh +13 -0
- data/ext/asmjit/asmjit/tools/configure-vs2019-x64.bat +2 -0
- data/ext/asmjit/asmjit/tools/configure-vs2019-x86.bat +2 -0
- data/ext/asmjit/asmjit/tools/configure-vs2022-x64.bat +2 -0
- data/ext/asmjit/asmjit/tools/configure-vs2022-x86.bat +2 -0
- data/ext/asmjit/asmjit/tools/configure-xcode.sh +8 -0
- data/ext/asmjit/asmjit/tools/enumgen.js +417 -0
- data/ext/asmjit/asmjit/tools/enumgen.sh +3 -0
- data/ext/asmjit/asmjit/tools/tablegen-arm.js +365 -0
- data/ext/asmjit/asmjit/tools/tablegen-arm.sh +3 -0
- data/ext/asmjit/asmjit/tools/tablegen-x86.js +2638 -0
- data/ext/asmjit/asmjit/tools/tablegen-x86.sh +3 -0
- data/ext/asmjit/asmjit/tools/tablegen.js +947 -0
- data/ext/asmjit/asmjit/tools/tablegen.sh +4 -0
- data/ext/asmjit/asmjit.cc +18 -0
- data/lib/asmjit/version.rb +1 -1
- metadata +197 -2
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// This file is part of AsmJit project <https://asmjit.com>
|
|
2
|
+
//
|
|
3
|
+
// See asmjit.h or LICENSE.md for license and copyright information
|
|
4
|
+
// SPDX-License-Identifier: Zlib
|
|
5
|
+
|
|
6
|
+
#include "../core/api-build_p.h"
|
|
7
|
+
#include "../core/assembler.h"
|
|
8
|
+
#include "../core/emitterutils_p.h"
|
|
9
|
+
#include "../core/formatter_p.h"
|
|
10
|
+
#include "../core/logger.h"
|
|
11
|
+
#include "../core/support.h"
|
|
12
|
+
|
|
13
|
+
ASMJIT_BEGIN_NAMESPACE
|
|
14
|
+
|
|
15
|
+
namespace EmitterUtils {
|
|
16
|
+
|
|
17
|
+
#ifndef ASMJIT_NO_LOGGING
|
|
18
|
+
|
|
19
|
+
Error finishFormattedLine(String& sb, const FormatOptions& formatOptions, const uint8_t* binData, size_t binSize, size_t offsetSize, size_t immSize, const char* comment) noexcept {
|
|
20
|
+
ASMJIT_ASSERT(binSize >= offsetSize);
|
|
21
|
+
const size_t kNoBinSize = SIZE_MAX;
|
|
22
|
+
|
|
23
|
+
size_t commentSize = comment ? Support::strLen(comment, Globals::kMaxCommentSize) : 0;
|
|
24
|
+
|
|
25
|
+
if ((binSize != 0 && binSize != kNoBinSize) || commentSize) {
|
|
26
|
+
char sep = ';';
|
|
27
|
+
size_t padding = Formatter::paddingFromOptions(formatOptions, FormatPaddingGroup::kRegularLine);
|
|
28
|
+
|
|
29
|
+
for (size_t i = (binSize == kNoBinSize); i < 2; i++) {
|
|
30
|
+
ASMJIT_PROPAGATE(sb.padEnd(padding));
|
|
31
|
+
|
|
32
|
+
if (sep) {
|
|
33
|
+
ASMJIT_PROPAGATE(sb.append(sep));
|
|
34
|
+
ASMJIT_PROPAGATE(sb.append(' '));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Append binary data or comment.
|
|
38
|
+
if (i == 0) {
|
|
39
|
+
ASMJIT_PROPAGATE(sb.appendHex(binData, binSize - offsetSize - immSize));
|
|
40
|
+
ASMJIT_PROPAGATE(sb.appendChars('.', offsetSize * 2));
|
|
41
|
+
ASMJIT_PROPAGATE(sb.appendHex(binData + binSize - immSize, immSize));
|
|
42
|
+
if (commentSize == 0) break;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
ASMJIT_PROPAGATE(sb.append(comment, commentSize));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
sep = '|';
|
|
49
|
+
padding += Formatter::paddingFromOptions(formatOptions, FormatPaddingGroup::kMachineCode);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return sb.append('\n');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
void logLabelBound(BaseAssembler* self, const Label& label) noexcept {
|
|
57
|
+
Logger* logger = self->logger();
|
|
58
|
+
|
|
59
|
+
StringTmp<512> sb;
|
|
60
|
+
size_t binSize = logger->hasFlag(FormatFlags::kMachineCode) ? size_t(0) : SIZE_MAX;
|
|
61
|
+
|
|
62
|
+
sb.appendChars(' ', logger->indentation(FormatIndentationGroup::kLabel));
|
|
63
|
+
Formatter::formatLabel(sb, logger->flags(), self, label.id());
|
|
64
|
+
sb.append(':');
|
|
65
|
+
finishFormattedLine(sb, logger->options(), nullptr, binSize, 0, 0, self->_inlineComment);
|
|
66
|
+
logger->log(sb.data(), sb.size());
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
void logInstructionEmitted(
|
|
70
|
+
BaseAssembler* self,
|
|
71
|
+
InstId instId,
|
|
72
|
+
InstOptions options,
|
|
73
|
+
const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt,
|
|
74
|
+
uint32_t relSize, uint32_t immSize, uint8_t* afterCursor) {
|
|
75
|
+
|
|
76
|
+
Logger* logger = self->logger();
|
|
77
|
+
ASMJIT_ASSERT(logger != nullptr);
|
|
78
|
+
|
|
79
|
+
StringTmp<256> sb;
|
|
80
|
+
FormatFlags formatFlags = logger->flags();
|
|
81
|
+
|
|
82
|
+
uint8_t* beforeCursor = self->bufferPtr();
|
|
83
|
+
intptr_t emittedSize = (intptr_t)(afterCursor - beforeCursor);
|
|
84
|
+
|
|
85
|
+
Operand_ opArray[Globals::kMaxOpCount];
|
|
86
|
+
opArrayFromEmitArgs(opArray, o0, o1, o2, opExt);
|
|
87
|
+
|
|
88
|
+
sb.appendChars(' ', logger->indentation(FormatIndentationGroup::kCode));
|
|
89
|
+
self->_funcs.formatInstruction(sb, formatFlags, self, self->arch(), BaseInst(instId, options, self->extraReg()), opArray, Globals::kMaxOpCount);
|
|
90
|
+
|
|
91
|
+
if (Support::test(formatFlags, FormatFlags::kMachineCode))
|
|
92
|
+
finishFormattedLine(sb, logger->options(), self->bufferPtr(), size_t(emittedSize), relSize, immSize, self->inlineComment());
|
|
93
|
+
else
|
|
94
|
+
finishFormattedLine(sb, logger->options(), nullptr, SIZE_MAX, 0, 0, self->inlineComment());
|
|
95
|
+
logger->log(sb);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
Error logInstructionFailed(
|
|
99
|
+
BaseAssembler* self,
|
|
100
|
+
Error err,
|
|
101
|
+
InstId instId,
|
|
102
|
+
InstOptions options,
|
|
103
|
+
const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) {
|
|
104
|
+
|
|
105
|
+
StringTmp<256> sb;
|
|
106
|
+
sb.append(DebugUtils::errorAsString(err));
|
|
107
|
+
sb.append(": ");
|
|
108
|
+
|
|
109
|
+
Operand_ opArray[Globals::kMaxOpCount];
|
|
110
|
+
opArrayFromEmitArgs(opArray, o0, o1, o2, opExt);
|
|
111
|
+
|
|
112
|
+
self->_funcs.formatInstruction(sb, FormatFlags::kNone, self, self->arch(), BaseInst(instId, options, self->extraReg()), opArray, Globals::kMaxOpCount);
|
|
113
|
+
|
|
114
|
+
if (self->inlineComment()) {
|
|
115
|
+
sb.append(" ; ");
|
|
116
|
+
sb.append(self->inlineComment());
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
self->resetInstOptions();
|
|
120
|
+
self->resetExtraReg();
|
|
121
|
+
self->resetInlineComment();
|
|
122
|
+
return self->reportError(err, sb.data());
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
#endif
|
|
126
|
+
|
|
127
|
+
} // {EmitterUtils}
|
|
128
|
+
|
|
129
|
+
ASMJIT_END_NAMESPACE
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// This file is part of AsmJit project <https://asmjit.com>
|
|
2
|
+
//
|
|
3
|
+
// See asmjit.h or LICENSE.md for license and copyright information
|
|
4
|
+
// SPDX-License-Identifier: Zlib
|
|
5
|
+
|
|
6
|
+
#ifndef ASMJIT_CORE_EMITTERUTILS_P_H_INCLUDED
|
|
7
|
+
#define ASMJIT_CORE_EMITTERUTILS_P_H_INCLUDED
|
|
8
|
+
|
|
9
|
+
#include "../core/emitter.h"
|
|
10
|
+
#include "../core/operand.h"
|
|
11
|
+
|
|
12
|
+
ASMJIT_BEGIN_NAMESPACE
|
|
13
|
+
|
|
14
|
+
class BaseAssembler;
|
|
15
|
+
class FormatOptions;
|
|
16
|
+
|
|
17
|
+
//! \cond INTERNAL
|
|
18
|
+
//! \addtogroup asmjit_core
|
|
19
|
+
//! \{
|
|
20
|
+
|
|
21
|
+
//! Utilities used by various emitters, mostly Assembler implementations.
|
|
22
|
+
namespace EmitterUtils {
|
|
23
|
+
|
|
24
|
+
//! Default paddings used by Emitter utils and Formatter.
|
|
25
|
+
|
|
26
|
+
static constexpr Operand noExt[3];
|
|
27
|
+
|
|
28
|
+
enum kOpIndex : uint32_t {
|
|
29
|
+
kOp3 = 0,
|
|
30
|
+
kOp4 = 1,
|
|
31
|
+
kOp5 = 2
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
static ASMJIT_FORCE_INLINE uint32_t opCountFromEmitArgs(const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) noexcept {
|
|
35
|
+
uint32_t opCount = 0;
|
|
36
|
+
|
|
37
|
+
if (opExt[kOp3].isNone()) {
|
|
38
|
+
if (!o0.isNone()) opCount = 1;
|
|
39
|
+
if (!o1.isNone()) opCount = 2;
|
|
40
|
+
if (!o2.isNone()) opCount = 3;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
opCount = 4;
|
|
44
|
+
if (!opExt[kOp4].isNone()) {
|
|
45
|
+
opCount = 5 + uint32_t(!opExt[kOp5].isNone());
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return opCount;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
static ASMJIT_FORCE_INLINE void opArrayFromEmitArgs(Operand_ dst[Globals::kMaxOpCount], const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) noexcept {
|
|
53
|
+
dst[0].copyFrom(o0);
|
|
54
|
+
dst[1].copyFrom(o1);
|
|
55
|
+
dst[2].copyFrom(o2);
|
|
56
|
+
dst[3].copyFrom(opExt[kOp3]);
|
|
57
|
+
dst[4].copyFrom(opExt[kOp4]);
|
|
58
|
+
dst[5].copyFrom(opExt[kOp5]);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
#ifndef ASMJIT_NO_LOGGING
|
|
62
|
+
Error finishFormattedLine(String& sb, const FormatOptions& formatOptions, const uint8_t* binData, size_t binSize, size_t offsetSize, size_t immSize, const char* comment) noexcept;
|
|
63
|
+
|
|
64
|
+
void logLabelBound(BaseAssembler* self, const Label& label) noexcept;
|
|
65
|
+
|
|
66
|
+
void logInstructionEmitted(
|
|
67
|
+
BaseAssembler* self,
|
|
68
|
+
InstId instId,
|
|
69
|
+
InstOptions options,
|
|
70
|
+
const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt,
|
|
71
|
+
uint32_t relSize, uint32_t immSize, uint8_t* afterCursor);
|
|
72
|
+
|
|
73
|
+
Error logInstructionFailed(
|
|
74
|
+
BaseAssembler* self,
|
|
75
|
+
Error err,
|
|
76
|
+
InstId instId,
|
|
77
|
+
InstOptions options,
|
|
78
|
+
const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt);
|
|
79
|
+
#endif
|
|
80
|
+
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
//! \}
|
|
84
|
+
//! \endcond
|
|
85
|
+
|
|
86
|
+
ASMJIT_END_NAMESPACE
|
|
87
|
+
|
|
88
|
+
#endif // ASMJIT_CORE_EMITTERUTILS_P_H_INCLUDED
|
|
89
|
+
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// This file is part of AsmJit project <https://asmjit.com>
|
|
2
|
+
//
|
|
3
|
+
// See asmjit.h or LICENSE.md for license and copyright information
|
|
4
|
+
// SPDX-License-Identifier: Zlib
|
|
5
|
+
|
|
6
|
+
#include "../core/api-build_p.h"
|
|
7
|
+
#include "../core/environment.h"
|
|
8
|
+
|
|
9
|
+
ASMJIT_BEGIN_NAMESPACE
|
|
10
|
+
|
|
11
|
+
// X86 Target
|
|
12
|
+
// ----------
|
|
13
|
+
//
|
|
14
|
+
// - 32-bit - Linux, OSX, BSD, and apparently also Haiku guarantee 16-byte
|
|
15
|
+
// stack alignment. Other operating systems are assumed to have
|
|
16
|
+
// 4-byte alignment by default for safety reasons.
|
|
17
|
+
// - 64-bit - stack must be aligned to 16 bytes.
|
|
18
|
+
//
|
|
19
|
+
// ARM Target
|
|
20
|
+
// ----------
|
|
21
|
+
//
|
|
22
|
+
// - 32-bit - Stack must be aligned to 8 bytes.
|
|
23
|
+
// - 64-bit - Stack must be aligned to 16 bytes (hardware requirement).
|
|
24
|
+
uint32_t Environment::stackAlignment() const noexcept {
|
|
25
|
+
if (is64Bit()) {
|
|
26
|
+
// Assume 16-byte alignment on any 64-bit target.
|
|
27
|
+
return 16;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
// The following platforms use 16-byte alignment in 32-bit mode.
|
|
31
|
+
if (isPlatformLinux() ||
|
|
32
|
+
isPlatformBSD() ||
|
|
33
|
+
isPlatformApple() ||
|
|
34
|
+
isPlatformHaiku()) {
|
|
35
|
+
return 16u;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (isFamilyARM())
|
|
39
|
+
return 8;
|
|
40
|
+
|
|
41
|
+
// Bail to 4-byte alignment if we don't know.
|
|
42
|
+
return 4;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
ASMJIT_END_NAMESPACE
|