Better SourcePos reporting for gathers/scatters
This commit is contained in:
20
ctx.cpp
20
ctx.cpp
@@ -1598,13 +1598,21 @@ FunctionEmitContext::addGSMetadata(llvm::Value *v, SourcePos pos) {
|
|||||||
llvm::MDNode *md = llvm::MDNode::get(*g->ctx, str);
|
llvm::MDNode *md = llvm::MDNode::get(*g->ctx, str);
|
||||||
inst->setMetadata("filename", md);
|
inst->setMetadata("filename", md);
|
||||||
|
|
||||||
llvm::Value *line = LLVMInt32(pos.first_line);
|
llvm::Value *first_line = LLVMInt32(pos.first_line);
|
||||||
md = llvm::MDNode::get(*g->ctx, line);
|
md = llvm::MDNode::get(*g->ctx, first_line);
|
||||||
inst->setMetadata("line", md);
|
inst->setMetadata("first_line", md);
|
||||||
|
|
||||||
llvm::Value *column = LLVMInt32(pos.first_column);
|
llvm::Value *first_column = LLVMInt32(pos.first_column);
|
||||||
md = llvm::MDNode::get(*g->ctx, column);
|
md = llvm::MDNode::get(*g->ctx, first_column);
|
||||||
inst->setMetadata("column", md);
|
inst->setMetadata("first_column", md);
|
||||||
|
|
||||||
|
llvm::Value *last_line = LLVMInt32(pos.last_line);
|
||||||
|
md = llvm::MDNode::get(*g->ctx, last_line);
|
||||||
|
inst->setMetadata("last_line", md);
|
||||||
|
|
||||||
|
llvm::Value *last_column = LLVMInt32(pos.last_column);
|
||||||
|
md = llvm::MDNode::get(*g->ctx, last_column);
|
||||||
|
inst->setMetadata("last_column", md);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
8
ispc.cpp
8
ispc.cpp
@@ -350,10 +350,12 @@ Globals::Globals() {
|
|||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
// SourcePos
|
// SourcePos
|
||||||
|
|
||||||
SourcePos::SourcePos(const char *n, int l, int c) {
|
SourcePos::SourcePos(const char *n, int fl, int fc, int ll, int lc) {
|
||||||
name = n ? n : m->module->getModuleIdentifier().c_str();
|
name = n ? n : m->module->getModuleIdentifier().c_str();
|
||||||
first_line = last_line = l;
|
first_line = fl;
|
||||||
first_column = last_column = c;
|
first_column = fc;
|
||||||
|
last_line = ll != 0 ? ll : fl;
|
||||||
|
last_column = lc != 0 ? lc : fc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
3
ispc.h
3
ispc.h
@@ -104,7 +104,8 @@ struct VariableDeclaration;
|
|||||||
lexing code). Both lines and columns are counted starting from one.
|
lexing code). Both lines and columns are counted starting from one.
|
||||||
*/
|
*/
|
||||||
struct SourcePos {
|
struct SourcePos {
|
||||||
SourcePos(const char *n = NULL, int l = 0, int c = 0);
|
SourcePos(const char *n = NULL, int fl = 0, int fc = 0,
|
||||||
|
int ll = 0, int lc = 0);
|
||||||
|
|
||||||
const char *name;
|
const char *name;
|
||||||
int first_line;
|
int first_line;
|
||||||
|
|||||||
30
opt.cpp
30
opt.cpp
@@ -142,23 +142,33 @@ lCopyMetadata(llvm::Value *vto, const llvm::Instruction *from) {
|
|||||||
static bool
|
static bool
|
||||||
lGetSourcePosFromMetadata(const llvm::Instruction *inst, SourcePos *pos) {
|
lGetSourcePosFromMetadata(const llvm::Instruction *inst, SourcePos *pos) {
|
||||||
llvm::MDNode *filename = inst->getMetadata("filename");
|
llvm::MDNode *filename = inst->getMetadata("filename");
|
||||||
llvm::MDNode *line = inst->getMetadata("line");
|
llvm::MDNode *first_line = inst->getMetadata("first_line");
|
||||||
llvm::MDNode *column = inst->getMetadata("column");
|
llvm::MDNode *first_column = inst->getMetadata("first_column");
|
||||||
if (!filename || !line || !column)
|
llvm::MDNode *last_line = inst->getMetadata("last_line");
|
||||||
|
llvm::MDNode *last_column = inst->getMetadata("last_column");
|
||||||
|
if (!filename || !first_line || !first_column || !last_line || !last_column)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// All of these asserts are things that FunctionEmitContext::addGSMetadata() is
|
// All of these asserts are things that FunctionEmitContext::addGSMetadata() is
|
||||||
// expected to have done in its operation
|
// expected to have done in its operation
|
||||||
assert(filename->getNumOperands() == 1 && line->getNumOperands() == 1);
|
|
||||||
llvm::MDString *str = llvm::dyn_cast<llvm::MDString>(filename->getOperand(0));
|
llvm::MDString *str = llvm::dyn_cast<llvm::MDString>(filename->getOperand(0));
|
||||||
assert(str);
|
assert(str);
|
||||||
llvm::ConstantInt *lnum = llvm::dyn_cast<llvm::ConstantInt>(line->getOperand(0));
|
llvm::ConstantInt *first_lnum =
|
||||||
assert(lnum);
|
llvm::dyn_cast<llvm::ConstantInt>(first_line->getOperand(0));
|
||||||
llvm::ConstantInt *colnum = llvm::dyn_cast<llvm::ConstantInt>(column->getOperand(0));
|
assert(first_lnum);
|
||||||
assert(column);
|
llvm::ConstantInt *first_colnum =
|
||||||
|
llvm::dyn_cast<llvm::ConstantInt>(first_column->getOperand(0));
|
||||||
|
assert(first_column);
|
||||||
|
llvm::ConstantInt *last_lnum =
|
||||||
|
llvm::dyn_cast<llvm::ConstantInt>(last_line->getOperand(0));
|
||||||
|
assert(last_lnum);
|
||||||
|
llvm::ConstantInt *last_colnum =
|
||||||
|
llvm::dyn_cast<llvm::ConstantInt>(last_column->getOperand(0));
|
||||||
|
assert(last_column);
|
||||||
|
|
||||||
*pos = SourcePos(str->getString().data(), (int)lnum->getZExtValue(),
|
*pos = SourcePos(str->getString().data(), (int)first_lnum->getZExtValue(),
|
||||||
(int)colnum->getZExtValue());
|
(int)first_colnum->getZExtValue(), (int)last_lnum->getZExtValue(),
|
||||||
|
(int)last_colnum->getZExtValue());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user