Better SourcePos reporting for gathers/scatters

This commit is contained in:
Matt Pharr
2011-11-16 16:22:51 -08:00
parent f5a21d96a1
commit 068ea3e4c4
4 changed files with 41 additions and 20 deletions

20
ctx.cpp
View File

@@ -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);
} }

View File

@@ -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
View File

@@ -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
View File

@@ -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;
} }