136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===-- InstrinsicInst.cpp - Intrinsic Instruction Wrappers ---------------===//
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);
38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return nullptr;
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
60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
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