[Bug] Assign inline comments to Invoke/Func nodes, annotate without Logger

This commit is contained in:
kobalicek
2023-01-08 13:50:35 +01:00
parent 6a414ea141
commit 8a33b814d6
11 changed files with 97 additions and 34 deletions

View File

@@ -14,7 +14,7 @@ jobs:
steps:
- name: "Checkout"
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: "Setup node.js"
uses: actions/setup-node@v1

View File

@@ -4997,9 +4997,7 @@ EmitDone:
#endif
}
resetExtraReg();
resetInstOptions();
resetInlineComment();
resetState();
writer.done(this);
return kErrorOk;
@@ -5025,9 +5023,7 @@ Failed:
#ifndef ASMJIT_NO_LOGGING
return EmitterUtils::logInstructionFailed(this, err, instId, options, o0, o1, o2, opExt);
#else
resetExtraReg();
resetInstOptions();
resetInlineComment();
resetState();
return reportError(err);
#endif
}

View File

@@ -597,9 +597,7 @@ Error BaseBuilder::_emit(InstId instId, const Operand_& o0, const Operand_& o1,
#ifndef ASMJIT_NO_LOGGING
return EmitterUtils::logInstructionFailed(this, err, instId, options, o0, o1, o2, opExt);
#else
resetInstOptions();
resetExtraReg();
resetInlineComment();
resetState();
return reportError(err);
#endif
}

View File

@@ -0,0 +1,35 @@
// This file is part of AsmJit project <https://asmjit.com>
//
// See asmjit.h or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_BUILDER_P_H_INCLUDED
#define ASMJIT_CORE_BUILDER_P_H_INCLUDED
#include "../core/api-config.h"
#ifndef ASMJIT_NO_BUILDER
#include "../core/builder.h"
ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_builder
//! \{
static inline void BaseBuilder_assignInlineComment(BaseBuilder* self, BaseNode* node, const char* comment) noexcept {
if (comment)
node->setInlineComment(static_cast<char*>(self->_dataZone.dup(comment, strlen(comment), true)));
}
static inline void BaseBuilder_assignInstState(BaseBuilder* self, InstNode* node, const BaseEmitter::State& state) noexcept {
node->setOptions(state.options);
node->setExtraReg(state.extraReg);
BaseBuilder_assignInlineComment(self, node, state.comment);
}
//! \}
ASMJIT_END_NAMESPACE
#endif // !ASMJIT_NO_BUILDER
#endif // ASMJIT_CORE_BUILDER_P_H_INCLUDED

View File

@@ -7,6 +7,7 @@
#ifndef ASMJIT_NO_COMPILER
#include "../core/assembler.h"
#include "../core/builder_p.h"
#include "../core/compiler.h"
#include "../core/cpuinfo.h"
#include "../core/logger.h"
@@ -103,9 +104,13 @@ Error BaseCompiler::newFuncNode(FuncNode** out, const FuncSignature& signature)
}
Error BaseCompiler::addFuncNode(FuncNode** out, const FuncSignature& signature) {
State state = _grabState();
ASMJIT_PROPAGATE(newFuncNode(out, signature));
ASMJIT_ASSUME(*out != nullptr);
BaseBuilder_assignInlineComment(this, *out, state.comment);
addFunc(*out);
return kErrorOk;
}
@@ -127,7 +132,13 @@ Error BaseCompiler::newFuncRetNode(FuncRetNode** out, const Operand_& o0, const
}
Error BaseCompiler::addFuncRetNode(FuncRetNode** out, const Operand_& o0, const Operand_& o1) {
State state = _grabState();
ASMJIT_PROPAGATE(newFuncRetNode(out, o0, o1));
ASMJIT_ASSUME(*out != nullptr);
BaseBuilder_assignInlineComment(this, *out, state.comment);
addNode(*out);
return kErrorOk;
}
@@ -146,6 +157,7 @@ FuncNode* BaseCompiler::addFunc(FuncNode* func) {
Error BaseCompiler::endFunc() {
FuncNode* func = _func;
resetState();
if (ASMJIT_UNLIKELY(!func))
return reportError(DebugUtils::errored(kErrorInvalidState));
@@ -196,7 +208,12 @@ Error BaseCompiler::newInvokeNode(InvokeNode** out, InstId instId, const Operand
}
Error BaseCompiler::addInvokeNode(InvokeNode** out, InstId instId, const Operand_& o0, const FuncSignature& signature) {
State state = _grabState();
ASMJIT_PROPAGATE(newInvokeNode(out, instId, o0, signature));
ASMJIT_ASSUME(*out != nullptr);
BaseBuilder_assignInstState(this, *out, state);
addNode(*out);
return kErrorOk;
}
@@ -481,20 +498,13 @@ Error BaseCompiler::newJumpNode(JumpNode** out, InstId instId, InstOptions instO
}
Error BaseCompiler::emitAnnotatedJump(InstId instId, const Operand_& o0, JumpAnnotation* annotation) {
InstOptions options = instOptions() | forcedInstOptions();
RegOnly extra = extraReg();
const char* comment = inlineComment();
resetInstOptions();
resetInlineComment();
resetExtraReg();
State state = _grabState();
JumpNode* node;
ASMJIT_PROPAGATE(newJumpNode(&node, instId, options, o0, annotation));
ASMJIT_PROPAGATE(newJumpNode(&node, instId, state.options, o0, annotation));
node->setExtraReg(extra);
if (comment)
node->setInlineComment(static_cast<char*>(_dataZone.dup(comment, strlen(comment), true)));
node->setExtraReg(state.extraReg);
BaseBuilder_assignInlineComment(this, node, state.comment);
addNode(node);
return kErrorOk;

View File

@@ -233,6 +233,13 @@ public:
//! Native GP register signature and signature related information.
OperandSignature _gpSignature {};
//! Emitter state that can be used to specify options and inline comment of a next node or instruction.
struct State {
InstOptions options;
RegOnly extraReg;
const char* comment;
};
//! Next instruction options (affects the next instruction).
InstOptions _instOptions = InstOptions::kNone;
//! Extra register (op-mask {k} on AVX-512) (affects the next instruction).
@@ -530,6 +537,23 @@ public:
//! \}
//! \name Emitter State
//! \{
inline void resetState() noexcept {
resetInstOptions();
resetExtraReg();
resetInlineComment();
}
inline State _grabState() noexcept {
State s{_instOptions | _forcedInstOptions, _extraReg, _inlineComment};
resetState();
return s;
}
//! \}
//! \name Sections
//! \{

View File

@@ -116,9 +116,7 @@ Error logInstructionFailed(
sb.append(self->inlineComment());
}
self->resetInstOptions();
self->resetExtraReg();
self->resetInlineComment();
self->resetState();
return self->reportError(err, sb.data());
}

View File

@@ -114,11 +114,14 @@ Error BaseRAPass::runOnFunction(Zone* zone, Logger* logger, FuncNode* func) {
#ifndef ASMJIT_NO_LOGGING
_logger = logger;
_formatOptions.reset();
_diagnosticOptions = DiagnosticOptions::kNone;
_diagnosticOptions = _cb->diagnosticOptions();
if (logger) {
_formatOptions = logger->options();
_diagnosticOptions = _cb->diagnosticOptions();
}
else {
_diagnosticOptions &= ~(DiagnosticOptions::kRADebugCFG |
DiagnosticOptions::kRADebugUnreachable);
}
#else
DebugUtils::unused(logger);

View File

@@ -4950,10 +4950,7 @@ EmitDone:
#endif
}
resetExtraReg();
resetInstOptions();
resetInlineComment();
resetState();
writer.done(this);
return kErrorOk;
@@ -4987,9 +4984,7 @@ Failed:
#ifndef ASMJIT_NO_LOGGING
return EmitterUtils::logInstructionFailed(this, err, instId, options, o0, o1, o2, opExt);
#else
resetExtraReg();
resetInstOptions();
resetInlineComment();
resetState();
return reportError(err);
#endif
}

View File

@@ -794,6 +794,9 @@ Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_*
if (ASMJIT_UNLIKELY(!Inst::isDefinedId(instId)))
return DebugUtils::errored(kErrorInvalidInstruction);
if (instId == Inst::kIdPop)
printf("HERE\n");
// Read/Write flags.
const InstDB::InstInfo& instInfo = InstDB::_instInfoTable[instId];
const InstDB::CommonInfo& commonInfo = InstDB::_commonInfoTable[instInfo._commonInfoIndex];

View File

@@ -2247,8 +2247,9 @@ class InstRWInfoTable extends core.Task {
const operands = dbInst.operands;
const rwOps = nullOps();
for (var j = 0; j < operands.length; j++)
for (var j = 0; j < operands.length; j++) {
rwOps[j] = makeRwFromOp(operands[j])
}
var match = 0;
for (var j = 0; j < rwOpsArray.length; j++)