14556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey//===-- InstrinsicInst.cpp - Intrinsic Instruction Wrappers -----*- C++ -*-===// 24556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey// 34556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey// The LLVM Compiler Infrastructure 44556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 74556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey// 84556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey//===----------------------------------------------------------------------===// 998a6979b253740a33d9187c95cf9e9085e4c28daJim Laskey// 1098a6979b253740a33d9187c95cf9e9085e4c28daJim Laskey// This file implements methods that make it really easy to deal with intrinsic 1144a29e066a24e88bdf127e88be4380a5f259c4b4Devang Patel// functions. 1298a6979b253740a33d9187c95cf9e9085e4c28daJim Laskey// 1398a6979b253740a33d9187c95cf9e9085e4c28daJim Laskey// All intrinsic function calls are instances of the call instruction, so these 1498a6979b253740a33d9187c95cf9e9085e4c28daJim Laskey// are all subclasses of the CallInst class. Note that none of these classes 1598a6979b253740a33d9187c95cf9e9085e4c28daJim Laskey// has state or virtual methods, which is an important part of this gross/neat 1698a6979b253740a33d9187c95cf9e9085e4c28daJim Laskey// hack working. 1798a6979b253740a33d9187c95cf9e9085e4c28daJim Laskey// 1898a6979b253740a33d9187c95cf9e9085e4c28daJim Laskey// In some cases, arguments to intrinsics need to be generic and are defined as 1998a6979b253740a33d9187c95cf9e9085e4c28daJim Laskey// type pointer to empty struct { }*. To access the real item of interest the 2098a6979b253740a33d9187c95cf9e9085e4c28daJim Laskey// cast instruction needs to be stripped away. 2198a6979b253740a33d9187c95cf9e9085e4c28daJim Laskey// 2298a6979b253740a33d9187c95cf9e9085e4c28daJim Laskey//===----------------------------------------------------------------------===// 234556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey 240b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/IntrinsicInst.h" 250b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constants.h" 260b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/GlobalVariable.h" 270b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Metadata.h" 284556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskeyusing namespace llvm; 294556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey 304556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey//===----------------------------------------------------------------------===// 314556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey/// DbgInfoIntrinsic - This is the common base class for debug info intrinsics 324556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey/// 334556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey 344556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskeystatic Value *CastOperand(Value *C) { 354556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) 363da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer if (CE->isCast()) 374556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey return CE->getOperand(0); 384556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey return NULL; 394556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey} 404556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey 414556ce5d115f93ad6809d77810b9b770e5f737f2Jim LaskeyValue *DbgInfoIntrinsic::StripCast(Value *C) { 424556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey if (Value *CO = CastOperand(C)) { 43fbcf23c3c12449c264f1448a2eee524be0b799f7Jim Laskey C = StripCast(CO); 444556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey } else if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) { 454556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey if (GV->hasInitializer()) 464556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey if (Value *CO = CastOperand(GV->getInitializer())) 47fbcf23c3c12449c264f1448a2eee524be0b799f7Jim Laskey C = StripCast(CO); 484556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey } 49fbcf23c3c12449c264f1448a2eee524be0b799f7Jim Laskey return dyn_cast<GlobalVariable>(C); 504556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey} 514556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey 524556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey//===----------------------------------------------------------------------===// 533a32865d58f015e7058444eab7085195c34da95aVictor Hernandez/// DbgDeclareInst - This represents the llvm.dbg.declare instruction. 543a32865d58f015e7058444eab7085195c34da95aVictor Hernandez/// 553a32865d58f015e7058444eab7085195c34da95aVictor Hernandez 563a32865d58f015e7058444eab7085195c34da95aVictor HernandezValue *DbgDeclareInst::getAddress() const { 5707f639fca4d9f6b6c2ccb40f17d33cae3b3d6771Gabor Greif if (MDNode* MD = cast_or_null<MDNode>(getArgOperand(0))) 583a32865d58f015e7058444eab7085195c34da95aVictor Hernandez return MD->getOperand(0); 593a32865d58f015e7058444eab7085195c34da95aVictor Hernandez else 603a32865d58f015e7058444eab7085195c34da95aVictor Hernandez return NULL; 613a32865d58f015e7058444eab7085195c34da95aVictor Hernandez} 623a32865d58f015e7058444eab7085195c34da95aVictor Hernandez 633a32865d58f015e7058444eab7085195c34da95aVictor Hernandez//===----------------------------------------------------------------------===// 64183912af7947e7c48da64d94b6fe78ebb09cc7ecChris Lattner/// DbgValueInst - This represents the llvm.dbg.value instruction. 65183912af7947e7c48da64d94b6fe78ebb09cc7ecChris Lattner/// 66183912af7947e7c48da64d94b6fe78ebb09cc7ecChris Lattner 675b7e48b56cfc0904636a0a1c0d4f7b81133c48c2Victor Hernandezconst Value *DbgValueInst::getValue() const { 6807f639fca4d9f6b6c2ccb40f17d33cae3b3d6771Gabor Greif return cast<MDNode>(getArgOperand(0))->getOperand(0); 695b7e48b56cfc0904636a0a1c0d4f7b81133c48c2Victor Hernandez} 705b7e48b56cfc0904636a0a1c0d4f7b81133c48c2Victor Hernandez 715b7e48b56cfc0904636a0a1c0d4f7b81133c48c2Victor HernandezValue *DbgValueInst::getValue() { 7207f639fca4d9f6b6c2ccb40f17d33cae3b3d6771Gabor Greif return cast<MDNode>(getArgOperand(0))->getOperand(0); 73183912af7947e7c48da64d94b6fe78ebb09cc7ecChris Lattner} 74