[Bf-blender-cvs] [13a84fc] object_nodes: Define names for most values in generated LLVM code.
Lukas Tönne
noreply at git.blender.org
Tue Jun 21 16:50:54 CEST 2016
Commit: 13a84fcb330841393cda92211f5c48f07683cfb2
Author: Lukas Tönne
Date: Tue Jun 21 16:50:04 2016 +0200
Branches: object_nodes
https://developer.blender.org/rB13a84fcb330841393cda92211f5c48f07683cfb2
Define names for most values in generated LLVM code.
These are purely for debugging the code, they help a lot in reading
LLVM dumps.
===================================================================
M source/blender/blenvm/bvm/bvm_codegen.cc
M source/blender/blenvm/bvm/bvm_codegen.h
M source/blender/blenvm/compile/compiler.cc
M source/blender/blenvm/compile/compiler.h
M source/blender/blenvm/llvm/llvm_codegen.cc
M source/blender/blenvm/llvm/llvm_codegen.h
===================================================================
diff --git a/source/blender/blenvm/bvm/bvm_codegen.cc b/source/blender/blenvm/bvm/bvm_codegen.cc
index efba057..369f2db 100644
--- a/source/blender/blenvm/bvm/bvm_codegen.cc
+++ b/source/blender/blenvm/bvm/bvm_codegen.cc
@@ -127,7 +127,7 @@ Value *BVMCodeGenerator::create_value(const TypeSpec *typespec)
return value;
}
-ValueHandle BVMCodeGenerator::alloc_node_value(const TypeSpec *typespec)
+ValueHandle BVMCodeGenerator::alloc_node_value(const TypeSpec *typespec, const string &UNUSED(name))
{
Value *value = create_value(typespec);
ValueHandle handle = get_handle(value);
diff --git a/source/blender/blenvm/bvm/bvm_codegen.h b/source/blender/blenvm/bvm/bvm_codegen.h
index b6fa88a..d048e7a 100644
--- a/source/blender/blenvm/bvm/bvm_codegen.h
+++ b/source/blender/blenvm/bvm/bvm_codegen.h
@@ -84,7 +84,7 @@ struct BVMCodeGenerator : public CodeGenerator {
void store_return_value(size_t output_index, const TypeSpec *typespec, ValueHandle value);
ValueHandle map_argument(size_t input_index, const TypeSpec *typespec);
- ValueHandle alloc_node_value(const TypeSpec *typespec);
+ ValueHandle alloc_node_value(const TypeSpec *typespec, const string &name);
ValueHandle create_constant(const TypeSpec *typespec, const NodeConstant *node_value);
void eval_node(const NodeType *nodetype,
diff --git a/source/blender/blenvm/compile/compiler.cc b/source/blender/blenvm/compile/compiler.cc
index 0d2a9b7..803c8e1 100644
--- a/source/blender/blenvm/compile/compiler.cc
+++ b/source/blender/blenvm/compile/compiler.cc
@@ -209,7 +209,8 @@ void Compiler::expand_expression_node(const NodeInstance *node, Scope &scope)
ConstOutputKey output = node->output(i);
const TypeSpec *typespec = output.socket->typedesc.get_typespec();
- ValueHandle value = m_codegen->alloc_node_value(typespec);
+ ValueHandle value = m_codegen->alloc_node_value(typespec,
+ output.node->name + "__" + output.socket->name);
output_args.push_back(value);
scope.set_value(output, value);
diff --git a/source/blender/blenvm/compile/compiler.h b/source/blender/blenvm/compile/compiler.h
index 375c0bd..954bb71 100644
--- a/source/blender/blenvm/compile/compiler.h
+++ b/source/blender/blenvm/compile/compiler.h
@@ -78,7 +78,7 @@ struct CodeGenerator {
virtual void store_return_value(size_t output_index, const TypeSpec *typespec, ValueHandle value) = 0;
virtual ValueHandle map_argument(size_t input_index, const TypeSpec *typespec) = 0;
- virtual ValueHandle alloc_node_value(const TypeSpec *typespec) = 0;
+ virtual ValueHandle alloc_node_value(const TypeSpec *typespec, const string &name) = 0;
virtual ValueHandle create_constant(const TypeSpec *typespec, const NodeConstant *node_value) = 0;
virtual void eval_node(const NodeType *nodetype,
diff --git a/source/blender/blenvm/llvm/llvm_codegen.cc b/source/blender/blenvm/llvm/llvm_codegen.cc
index 509eb07..fef7e7b 100644
--- a/source/blender/blenvm/llvm/llvm_codegen.cc
+++ b/source/blender/blenvm/llvm/llvm_codegen.cc
@@ -29,6 +29,7 @@
* \ingroup llvm
*/
+#include <cctype>
#include <cstdio>
#include <set>
#include <sstream>
@@ -76,6 +77,18 @@ class debug_assembly_annotation_writer : public llvm::AssemblyAnnotationWriter
/* ------------------------------------------------------------------------- */
+/* replace non-alphanumeric chars with underscore */
+static string sanitize_name(const string &name)
+{
+ string s = name;
+ for (string::iterator it = s.begin(); it != s.end(); ++it) {
+ char &c = *it;
+ if (c != '_' && !isalnum(c))
+ c = '_';
+ }
+ return s;
+}
+
/* forward declaration */
static llvm::Function *declare_graph_function(
llvm::LLVMContext &context,
@@ -245,9 +258,9 @@ void LLVMCodeGenerator::store_return_value(size_t output_index, const TypeSpec *
builder.SetInsertPoint(m_block);
Argument *arg = m_output_args[output_index];
- Value *value_ptr = builder.CreateStructGEP(arg, 0);
- Value *dx_ptr = builder.CreateStructGEP(arg, 1);
- Value *dy_ptr = builder.CreateStructGEP(arg, 2);
+ Value *value_ptr = builder.CreateStructGEP(arg, 0, sanitize_name(arg->getName().str() + "_V"));
+ Value *dx_ptr = builder.CreateStructGEP(arg, 1, sanitize_name(arg->getName().str() + "_DX"));
+ Value *dy_ptr = builder.CreateStructGEP(arg, 2, sanitize_name(arg->getName().str() + "_DY"));
DualValue dual = m_values.at(handle);
bvm_llvm_copy_value(context(), m_block, value_ptr, dual.value(), typespec);
@@ -266,9 +279,9 @@ ValueHandle LLVMCodeGenerator::map_argument(size_t input_index, const TypeSpec *
DualValue dval;
if (bvm_type_has_dual_value(typespec)) {
/* argument is a struct, use GEP instructions to get the individual elements */
- dval = DualValue(builder.CreateStructGEP(arg, 0),
- builder.CreateStructGEP(arg, 1),
- builder.CreateStructGEP(arg, 2));
+ dval = DualValue(builder.CreateStructGEP(arg, 0, sanitize_name(arg->getName().str() + "_V")),
+ builder.CreateStructGEP(arg, 1, sanitize_name(arg->getName().str() + "_DX")),
+ builder.CreateStructGEP(arg, 2, sanitize_name(arg->getName().str() + "_DY")));
}
else {
dval = DualValue(arg, NULL, NULL);
@@ -282,7 +295,7 @@ ValueHandle LLVMCodeGenerator::map_argument(size_t input_index, const TypeSpec *
return handle;
}
-ValueHandle LLVMCodeGenerator::alloc_node_value(const TypeSpec *typespec)
+ValueHandle LLVMCodeGenerator::alloc_node_value(const TypeSpec *typespec, const string &name)
{
using namespace llvm;
@@ -292,9 +305,9 @@ ValueHandle LLVMCodeGenerator::alloc_node_value(const TypeSpec *typespec)
Type *type = bvm_get_llvm_type(context(), typespec, false);
BLI_assert(type != NULL);
- DualValue dval(builder.CreateAlloca(type),
- builder.CreateAlloca(type),
- builder.CreateAlloca(type));
+ DualValue dval(builder.CreateAlloca(type, NULL, sanitize_name(name + "_V")),
+ builder.CreateAlloca(type, NULL, sanitize_name(name + "_DX")),
+ builder.CreateAlloca(type, NULL, sanitize_name(name + "_DY")));
ValueHandle handle = get_handle(dval);
bool ok = m_values.insert(HandleValueMap::value_type(handle, dval)).second;
@@ -463,7 +476,7 @@ static llvm::Function *declare_graph_function(
Function::arg_iterator arg_it = func->arg_begin();
for (int i = 0; arg_it != func->arg_end(); ++arg_it, ++i) {
- arg_it->setName(arg_names[i]);
+ arg_it->setName(sanitize_name(arg_names[i]));
}
return func;
@@ -560,7 +573,7 @@ static llvm::Function *declare_node_function(
Function::arg_iterator arg_it = func->arg_begin();
for (int i = 0; arg_it != func->arg_end(); ++arg_it, ++i) {
- arg_it->setName(arg_names[i]);
+ arg_it->setName(sanitize_name(arg_names[i]));
}
return func;
@@ -643,7 +656,7 @@ static llvm::Function *declare_elementary_node_function(
Function::arg_iterator arg_it = func->arg_begin();
for (int i = 0; arg_it != func->arg_end(); ++arg_it, ++i) {
- arg_it->setName(arg_names[i]);
+ arg_it->setName(sanitize_name(arg_names[i]));
}
return func;
diff --git a/source/blender/blenvm/llvm/llvm_codegen.h b/source/blender/blenvm/llvm/llvm_codegen.h
index 5313610..0736d25 100644
--- a/source/blender/blenvm/llvm/llvm_codegen.h
+++ b/source/blender/blenvm/llvm/llvm_codegen.h
@@ -87,7 +87,7 @@ struct LLVMCodeGenerator : public CodeGenerator {
void store_return_value(size_t output_index, const TypeSpec *typespec, ValueHandle value);
ValueHandle map_argument(size_t input_index, const TypeSpec *typespec);
- ValueHandle alloc_node_value(const TypeSpec *typespec);
+ ValueHandle alloc_node_value(const TypeSpec *typespec, const string &name);
ValueHandle create_constant(const TypeSpec *typespec, const NodeConstant *node_value);
void eval_node(const NodeType *nodetype,
More information about the Bf-blender-cvs
mailing list