Skip to content
This repository was archived by the owner on Feb 17, 2025. It is now read-only.

Commit 677d874

Browse files
committed
Implement PRINT_LLVM_OBJECT macro
This macro helps dumping LLVM entities to strings. See #209
1 parent 0c23686 commit 677d874

File tree

3 files changed

+60
-8
lines changed

3 files changed

+60
-8
lines changed

include/nil/blueprint/assigner.hpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454

5555
#include <nil/blueprint/logger.hpp>
5656
#include <nil/blueprint/layout_resolver.hpp>
57+
#include <nil/blueprint/macros.hpp>
5758
#include <nil/blueprint/input_reader.hpp>
5859
#include <nil/blueprint/memory.hpp>
5960
#include <nil/blueprint/non_native_marshalling.hpp>
@@ -349,7 +350,8 @@ namespace nil {
349350
memory.store(ptr++, globals[constant]);
350351
continue;
351352
}
352-
UNREACHABLE("Unsupported pointer initialization!");
353+
LLVM_PRINT(constant, str);
354+
UNREACHABLE("Unsupported pointer initialization: " + str);
353355
}
354356
if (!type->isAggregateType() && !type->isVectorTy()) {
355357
column_type<BlueprintFieldType> marshalled_field_val = marshal_field_val<BlueprintFieldType>(constant);
@@ -827,7 +829,8 @@ namespace nil {
827829
memory.store(ptr, zero_var);
828830
globals[global] = put_constant_into_assignment(ptr);
829831
} else {
830-
UNREACHABLE("Unhandled global variable");
832+
LLVM_PRINT(global, str);
833+
UNREACHABLE("Unhandled global variable: " + str);
831834
}
832835
}
833836

@@ -914,8 +917,10 @@ namespace nil {
914917
}
915918
break;
916919
}
917-
default:
918-
UNREACHABLE(std::string("Unhandled constant expression: ") + expr->getOpcodeName());
920+
default: {
921+
LLVM_PRINT(expr, str);
922+
UNREACHABLE("Unhandled constant expression: " + str);
923+
}
919924
}
920925
} else if (auto addr = llvm::dyn_cast<llvm::BlockAddress>(c)) {
921926
frame.scalars[c] = labels[addr->getBasicBlock()];
@@ -1191,7 +1196,8 @@ namespace nil {
11911196
else if (cmp_type->isCurveTy())
11921197
handle_curve_cmp(cmp_inst, frame);
11931198
else {
1194-
UNREACHABLE("Unsupported icmp operand type");
1199+
LLVM_PRINT(cmp_type, str);
1200+
UNREACHABLE("Unsupported icmp operand type: " + str);
11951201
}
11961202
return inst->getNextNonDebugInstruction();
11971203
}

include/nil/blueprint/logger.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
#ifndef ZKLLVM_ASSIGNER_INCLUDE_NIL_BLUEPRINT_LOGGER_HPP_
2727
#define ZKLLVM_ASSIGNER_INCLUDE_NIL_BLUEPRINT_LOGGER_HPP_
2828

29+
#include <nil/blueprint/macros.hpp>
30+
2931
#include <boost/log/core.hpp>
3032
#include <boost/log/trivial.hpp>
3133
#include <boost/log/expressions.hpp>
@@ -65,9 +67,7 @@ namespace nil {
6567
current_block = inst->getParent();
6668
BOOST_LOG_TRIVIAL(debug) << "\t" << current_block->getNameOrAsOperand();
6769
}
68-
std::string str;
69-
llvm::raw_string_ostream ss(str);
70-
inst->print(ss);
70+
LLVM_PRINT(inst, str);
7171
BOOST_LOG_TRIVIAL(debug) << "\t\t" << str;
7272
}
7373
};

include/nil/blueprint/macros.hpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
//---------------------------------------------------------------------------//
2+
// Copyright (c) 2024 Alexander Evgin <[email protected]>
3+
//
4+
// MIT License
5+
//
6+
// Permission is hereby granted, free of charge, to any person obtaining a copy
7+
// of this software and associated documentation files (the "Software"), to deal
8+
// in the Software without restriction, including without limitation the rights
9+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10+
// copies of the Software, and to permit persons to whom the Software is
11+
// furnished to do so, subject to the following conditions:
12+
//
13+
// The above copyright notice and this permission notice shall be included in all
14+
// copies or substantial portions of the Software.
15+
//
16+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22+
// SOFTWARE.
23+
//---------------------------------------------------------------------------//
24+
// @file This file defines some helpful macros, used in assigner.
25+
//---------------------------------------------------------------------------//
26+
27+
#ifndef ZKLLVM_ASSIGNER_INCLUDE_NIL_BLUEPRINT_MACROS_HPP_
28+
#define ZKLLVM_ASSIGNER_INCLUDE_NIL_BLUEPRINT_MACROS_HPP_
29+
30+
#include "llvm/Support/raw_ostream.h"
31+
32+
#include <string>
33+
34+
/**
35+
* @brief This macro calls `print` function of LLVM printable entity and stores result into
36+
* created string with name `output`.
37+
*
38+
* @param obj object, which can be printed with `obj->print()`
39+
* @param output name of the output string
40+
*/
41+
#define LLVM_PRINT(obj, output) \
42+
std::string output; \
43+
llvm::raw_string_ostream ss_##output(output); \
44+
obj->print(ss_##output);
45+
46+
#endif // ZKLLVM_ASSIGNER_INCLUDE_NIL_BLUEPRINT_MACROS_HPP_

0 commit comments

Comments
 (0)