diff options
author | Jim Laskey <jlaskey@mac.com> | 2006-03-23 18:05:12 +0000 |
---|---|---|
committer | Jim Laskey <jlaskey@mac.com> | 2006-03-23 18:05:12 +0000 |
commit | 4556ce5d115f93ad6809d77810b9b770e5f737f2 (patch) | |
tree | 77102581207ed224cfc22114479d06e88e36e13d | |
parent | c14897e673a34916041479c6ead823af8d3fd165 (diff) |
Simplify handling of llvm.dbg intrinsic operands to one spot.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26987 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/IntrinsicInst.h | 89 | ||||
-rw-r--r-- | lib/VMCore/IntrinsicInst.cpp | 55 |
2 files changed, 133 insertions, 11 deletions
diff --git a/include/llvm/IntrinsicInst.h b/include/llvm/IntrinsicInst.h index 4c8f2cf626..da1bc4ddce 100644 --- a/include/llvm/IntrinsicInst.h +++ b/include/llvm/IntrinsicInst.h @@ -66,16 +66,15 @@ namespace llvm { /// struct DbgInfoIntrinsic : public IntrinsicInst { - Value *getChain() const { return const_cast<Value*>(getOperand(1)); } - // Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const DbgInfoIntrinsic *) { return true; } static inline bool classof(const IntrinsicInst *I) { switch (I->getIntrinsicID()) { case Intrinsic::dbg_stoppoint: + case Intrinsic::dbg_func_start: case Intrinsic::dbg_region_start: case Intrinsic::dbg_region_end: - case Intrinsic::dbg_func_start: + case Intrinsic::dbg_declare: return true; default: return false; } @@ -83,21 +82,28 @@ namespace llvm { static inline bool classof(const Value *V) { return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V)); } + + static Value *StripCast(Value *C); }; - - /// DbgStopPointInst - This represent llvm.dbg.stoppoint instructions. + /// DbgStopPointInst - This represents the llvm.dbg.stoppoint instruction. /// struct DbgStopPointInst : public DbgInfoIntrinsic { + Value *getLineValue() const { return const_cast<Value*>(getOperand(1)); } + Value *getColumnValue() const { return const_cast<Value*>(getOperand(2)); } + Value *getContext() const { + return StripCast(getOperand(3)); + } - unsigned getLineNo() const { - return unsigned(cast<ConstantInt>(getOperand(2))->getRawValue()); + unsigned getLine() const { + return unsigned(cast<ConstantInt>(getOperand(1))->getRawValue()); } - unsigned getColNo() const { - return unsigned(cast<ConstantInt>(getOperand(3))->getRawValue()); + unsigned getColumn() const { + return unsigned(cast<ConstantInt>(getOperand(2))->getRawValue()); } - Value *getContext() const { return const_cast<Value*>(getOperand(4)); } - + + std::string getFileName() const; + std::string getDirectory() const; // Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const DbgStopPointInst *) { return true; } @@ -108,6 +114,67 @@ namespace llvm { return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V)); } }; + + /// DbgFuncStartInst - This represents the llvm.dbg.func.start instruction. + /// + struct DbgFuncStartInst : public DbgInfoIntrinsic { + Value *getSubprogram() const { return StripCast(getOperand(1)); } + + // Methods for support type inquiry through isa, cast, and dyn_cast: + static inline bool classof(const DbgFuncStartInst *) { return true; } + static inline bool classof(const IntrinsicInst *I) { + return I->getIntrinsicID() == Intrinsic::dbg_func_start; + } + static inline bool classof(const Value *V) { + return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V)); + } + }; + + /// DbgRegionStartInst - This represents the llvm.dbg.region.start + /// instruction. + struct DbgRegionStartInst : public DbgInfoIntrinsic { + Value *getContext() const { return StripCast(getOperand(1)); } + + // Methods for support type inquiry through isa, cast, and dyn_cast: + static inline bool classof(const DbgRegionStartInst *) { return true; } + static inline bool classof(const IntrinsicInst *I) { + return I->getIntrinsicID() == Intrinsic::dbg_region_start; + } + static inline bool classof(const Value *V) { + return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V)); + } + }; + + /// DbgRegionEndInst - This represents the llvm.dbg.region.end instruction. + /// + struct DbgRegionEndInst : public DbgInfoIntrinsic { + Value *getContext() const { return StripCast(getOperand(1)); } + + // Methods for support type inquiry through isa, cast, and dyn_cast: + static inline bool classof(const DbgRegionEndInst *) { return true; } + static inline bool classof(const IntrinsicInst *I) { + return I->getIntrinsicID() == Intrinsic::dbg_region_end; + } + static inline bool classof(const Value *V) { + return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V)); + } + }; + + /// DbgDeclareInst - This represents the llvm.dbg.declare instruction. + /// + struct DbgDeclareInst : public DbgInfoIntrinsic { + Value *getAllocA() const { return StripCast(getOperand(1)); } + Value *getVariable() const { return StripCast(getOperand(2)); } + + // Methods for support type inquiry through isa, cast, and dyn_cast: + static inline bool classof(const DbgDeclareInst *) { return true; } + static inline bool classof(const IntrinsicInst *I) { + return I->getIntrinsicID() == Intrinsic::dbg_declare; + } + static inline bool classof(const Value *V) { + return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V)); + } + }; /// MemIntrinsic - This is the common base class for memset/memcpy/memmove. /// diff --git a/lib/VMCore/IntrinsicInst.cpp b/lib/VMCore/IntrinsicInst.cpp new file mode 100644 index 0000000000..e34cd5bbef --- /dev/null +++ b/lib/VMCore/IntrinsicInst.cpp @@ -0,0 +1,55 @@ +//===-- InstrinsicInst.cpp - Intrinsic Instruction Wrappers -----*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file was developed by the LLVM research group and is distributed under +// the University of Illinois Open Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/IntrinsicInst.h" + +#include "llvm/Constants.h" +#include "llvm/GlobalVariable.h" + +using namespace llvm; + +//===----------------------------------------------------------------------===// +/// DbgInfoIntrinsic - This is the common base class for debug info intrinsics +/// + +static Value *CastOperand(Value *C) { + if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) + if (CE->getOpcode() == Instruction::Cast) + return CE->getOperand(0); + return NULL; +} + +Value *DbgInfoIntrinsic::StripCast(Value *C) { + if (Value *CO = CastOperand(C)) { + return StripCast(CO); + } else if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) { + if (GV->hasInitializer()) + if (Value *CO = CastOperand(GV->getInitializer())) + return StripCast(CO); + } + return C; +} + +//===----------------------------------------------------------------------===// +/// DbgStopPointInst - This represents the llvm.dbg.stoppoint instruction. +/// + +std::string DbgStopPointInst::getFileName() const { + GlobalVariable *GV = cast<GlobalVariable>(getContext()); + ConstantStruct *CS = cast<ConstantStruct>(GV->getInitializer()); + return CS->getOperand(4)->getStringValue(); +} + +std::string DbgStopPointInst::getDirectory() const { + GlobalVariable *GV = cast<GlobalVariable>(getContext()); + ConstantStruct *CS = cast<ConstantStruct>(GV->getInitializer()); + return CS->getOperand(5)->getStringValue(); +} + +//===----------------------------------------------------------------------===// |