diff --git a/include/llvm/IntrinsicInst.h b/include/llvm/IntrinsicInst.h index 4c8f2cf6264..da1bc4ddce6 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(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(V) && classof(cast(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(getOperand(1)); } + Value *getColumnValue() const { return const_cast(getOperand(2)); } + Value *getContext() const { + return StripCast(getOperand(3)); + } - unsigned getLineNo() const { + unsigned getLine() const { + return unsigned(cast(getOperand(1))->getRawValue()); + } + unsigned getColumn() const { return unsigned(cast(getOperand(2))->getRawValue()); } - unsigned getColNo() const { - return unsigned(cast(getOperand(3))->getRawValue()); - } - Value *getContext() const { return const_cast(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(V) && classof(cast(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(V) && classof(cast(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(V) && classof(cast(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(V) && classof(cast(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(V) && classof(cast(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 00000000000..e34cd5bbefd --- /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(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(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(getContext()); + ConstantStruct *CS = cast(GV->getInitializer()); + return CS->getOperand(4)->getStringValue(); +} + +std::string DbgStopPointInst::getDirectory() const { + GlobalVariable *GV = cast(getContext()); + ConstantStruct *CS = cast(GV->getInitializer()); + return CS->getOperand(5)->getStringValue(); +} + +//===----------------------------------------------------------------------===//