From 068ea3e4c4820fe6121406f6fff98d66875979dd Mon Sep 17 00:00:00 2001 From: Matt Pharr Date: Wed, 16 Nov 2011 16:22:51 -0800 Subject: [PATCH] Better SourcePos reporting for gathers/scatters --- ctx.cpp | 20 ++++++++++++++------ ispc.cpp | 8 +++++--- ispc.h | 3 ++- opt.cpp | 30 ++++++++++++++++++++---------- 4 files changed, 41 insertions(+), 20 deletions(-) diff --git a/ctx.cpp b/ctx.cpp index efc92921..0fd4a760 100644 --- a/ctx.cpp +++ b/ctx.cpp @@ -1598,13 +1598,21 @@ FunctionEmitContext::addGSMetadata(llvm::Value *v, SourcePos pos) { llvm::MDNode *md = llvm::MDNode::get(*g->ctx, str); inst->setMetadata("filename", md); - llvm::Value *line = LLVMInt32(pos.first_line); - md = llvm::MDNode::get(*g->ctx, line); - inst->setMetadata("line", md); + llvm::Value *first_line = LLVMInt32(pos.first_line); + md = llvm::MDNode::get(*g->ctx, first_line); + inst->setMetadata("first_line", md); - llvm::Value *column = LLVMInt32(pos.first_column); - md = llvm::MDNode::get(*g->ctx, column); - inst->setMetadata("column", md); + llvm::Value *first_column = LLVMInt32(pos.first_column); + md = llvm::MDNode::get(*g->ctx, first_column); + 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); } diff --git a/ispc.cpp b/ispc.cpp index e81cc7ad..73fe446a 100644 --- a/ispc.cpp +++ b/ispc.cpp @@ -350,10 +350,12 @@ Globals::Globals() { /////////////////////////////////////////////////////////////////////////// // 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(); - first_line = last_line = l; - first_column = last_column = c; + first_line = fl; + first_column = fc; + last_line = ll != 0 ? ll : fl; + last_column = lc != 0 ? lc : fc; } diff --git a/ispc.h b/ispc.h index 3de5a78f..99299c63 100644 --- a/ispc.h +++ b/ispc.h @@ -104,7 +104,8 @@ struct VariableDeclaration; lexing code). Both lines and columns are counted starting from one. */ 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; int first_line; diff --git a/opt.cpp b/opt.cpp index fb4ccdbc..1846f3ad 100644 --- a/opt.cpp +++ b/opt.cpp @@ -142,23 +142,33 @@ lCopyMetadata(llvm::Value *vto, const llvm::Instruction *from) { static bool lGetSourcePosFromMetadata(const llvm::Instruction *inst, SourcePos *pos) { llvm::MDNode *filename = inst->getMetadata("filename"); - llvm::MDNode *line = inst->getMetadata("line"); - llvm::MDNode *column = inst->getMetadata("column"); - if (!filename || !line || !column) + llvm::MDNode *first_line = inst->getMetadata("first_line"); + llvm::MDNode *first_column = inst->getMetadata("first_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; // All of these asserts are things that FunctionEmitContext::addGSMetadata() is // expected to have done in its operation - assert(filename->getNumOperands() == 1 && line->getNumOperands() == 1); llvm::MDString *str = llvm::dyn_cast(filename->getOperand(0)); assert(str); - llvm::ConstantInt *lnum = llvm::dyn_cast(line->getOperand(0)); - assert(lnum); - llvm::ConstantInt *colnum = llvm::dyn_cast(column->getOperand(0)); - assert(column); + llvm::ConstantInt *first_lnum = + llvm::dyn_cast(first_line->getOperand(0)); + assert(first_lnum); + llvm::ConstantInt *first_colnum = + llvm::dyn_cast(first_column->getOperand(0)); + assert(first_column); + llvm::ConstantInt *last_lnum = + llvm::dyn_cast(last_line->getOperand(0)); + assert(last_lnum); + llvm::ConstantInt *last_colnum = + llvm::dyn_cast(last_column->getOperand(0)); + assert(last_column); - *pos = SourcePos(str->getString().data(), (int)lnum->getZExtValue(), - (int)colnum->getZExtValue()); + *pos = SourcePos(str->getString().data(), (int)first_lnum->getZExtValue(), + (int)first_colnum->getZExtValue(), (int)last_lnum->getZExtValue(), + (int)last_colnum->getZExtValue()); return true; }