1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
use llvm_sys::core::*;
use llvm_sys::{LLVMValue, LLVMValueKind};

use std::ptr::NonNull;

pub struct Value {
  pub(crate) llvm_ptr: NonNull<LLVMValue>,
}

impl Value {
  pub fn value_kind(&self) -> ValueKind {
    unsafe { ValueKind::from(LLVMGetValueKind(self.llvm_ptr.as_ptr())) }
  }

  pub fn is_constant(&self) -> bool {
    unsafe { LLVMIsConstant(self.llvm_ptr.as_ptr()) != 0 }
  }

  pub fn is_undefined(&self) -> bool {
    unsafe { LLVMIsUndef(self.llvm_ptr.as_ptr()) != 0 }
  }

  pub fn is_null(&self) -> bool {
    unsafe { LLVMIsNull(self.llvm_ptr.as_ptr()) != 0 }
  }
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ValueKind {
  Argument,
  BasicBlock,
  MemoryUse,
  MemoryDef,
  MemoryPhi,
  Function,
  GlobalAlias,
  GlobalIFunc,
  GlobalVariable,
  BlockAddress,
  ConstantExpr,
  ConstantArray,
  ConstantStruct,
  ConstantVector,
  UndefValue,
  ConstantAggregateZero,
  ConstantDataArray,
  ConstantDataVector,
  ConstantInt,
  ConstantFP,
  ConstantPointerNull,
  ConstantTokenNone,
  MetadataAsValue,
  InlineAsm,
  Instruction,
}

impl From<LLVMValueKind> for ValueKind {
  fn from(value_kind: LLVMValueKind) -> ValueKind {
    match value_kind {
      LLVMValueKind::LLVMArgumentValueKind => ValueKind::Argument,
      LLVMValueKind::LLVMBasicBlockValueKind => ValueKind::BasicBlock,
      LLVMValueKind::LLVMMemoryUseValueKind => ValueKind::MemoryUse,
      LLVMValueKind::LLVMMemoryDefValueKind => ValueKind::MemoryDef,
      LLVMValueKind::LLVMMemoryPhiValueKind => ValueKind::MemoryPhi,
      LLVMValueKind::LLVMFunctionValueKind => ValueKind::Function,
      LLVMValueKind::LLVMGlobalAliasValueKind => ValueKind::GlobalAlias,
      LLVMValueKind::LLVMGlobalIFuncValueKind => ValueKind::GlobalIFunc,
      LLVMValueKind::LLVMGlobalVariableValueKind => ValueKind::GlobalVariable,
      LLVMValueKind::LLVMBlockAddressValueKind => ValueKind::BlockAddress,
      LLVMValueKind::LLVMConstantExprValueKind => ValueKind::ConstantExpr,
      LLVMValueKind::LLVMConstantArrayValueKind => ValueKind::ConstantArray,
      LLVMValueKind::LLVMConstantStructValueKind => ValueKind::ConstantStruct,
      LLVMValueKind::LLVMConstantVectorValueKind => ValueKind::ConstantVector,
      LLVMValueKind::LLVMUndefValueValueKind => ValueKind::UndefValue,
      LLVMValueKind::LLVMConstantAggregateZeroValueKind => ValueKind::ConstantAggregateZero,
      LLVMValueKind::LLVMConstantDataArrayValueKind => ValueKind::ConstantDataArray,
      LLVMValueKind::LLVMConstantDataVectorValueKind => ValueKind::ConstantDataVector,
      LLVMValueKind::LLVMConstantIntValueKind => ValueKind::ConstantInt,
      LLVMValueKind::LLVMConstantFPValueKind => ValueKind::ConstantFP,
      LLVMValueKind::LLVMConstantPointerNullValueKind => ValueKind::ConstantPointerNull,
      LLVMValueKind::LLVMConstantTokenNoneValueKind => ValueKind::ConstantTokenNone,
      LLVMValueKind::LLVMMetadataAsValueValueKind => ValueKind::MetadataAsValue,
      LLVMValueKind::LLVMInlineAsmValueKind => ValueKind::InlineAsm,
      LLVMValueKind::LLVMInstructionValueKind => ValueKind::Instruction,
    }
  }
}

impl From<ValueKind> for LLVMValueKind {
  fn from(value_kind: ValueKind) -> LLVMValueKind {
    match value_kind {
      ValueKind::Argument => LLVMValueKind::LLVMArgumentValueKind,
      ValueKind::BasicBlock => LLVMValueKind::LLVMBasicBlockValueKind,
      ValueKind::MemoryUse => LLVMValueKind::LLVMMemoryUseValueKind,
      ValueKind::MemoryDef => LLVMValueKind::LLVMMemoryDefValueKind,
      ValueKind::MemoryPhi => LLVMValueKind::LLVMMemoryPhiValueKind,
      ValueKind::Function => LLVMValueKind::LLVMFunctionValueKind,
      ValueKind::GlobalAlias => LLVMValueKind::LLVMGlobalAliasValueKind,
      ValueKind::GlobalIFunc => LLVMValueKind::LLVMGlobalIFuncValueKind,
      ValueKind::GlobalVariable => LLVMValueKind::LLVMGlobalVariableValueKind,
      ValueKind::BlockAddress => LLVMValueKind::LLVMBlockAddressValueKind,
      ValueKind::ConstantExpr => LLVMValueKind::LLVMConstantExprValueKind,
      ValueKind::ConstantArray => LLVMValueKind::LLVMConstantArrayValueKind,
      ValueKind::ConstantStruct => LLVMValueKind::LLVMConstantStructValueKind,
      ValueKind::ConstantVector => LLVMValueKind::LLVMConstantVectorValueKind,
      ValueKind::UndefValue => LLVMValueKind::LLVMUndefValueValueKind,
      ValueKind::ConstantAggregateZero => LLVMValueKind::LLVMConstantAggregateZeroValueKind,
      ValueKind::ConstantDataArray => LLVMValueKind::LLVMConstantDataArrayValueKind,
      ValueKind::ConstantDataVector => LLVMValueKind::LLVMConstantDataVectorValueKind,
      ValueKind::ConstantInt => LLVMValueKind::LLVMConstantIntValueKind,
      ValueKind::ConstantFP => LLVMValueKind::LLVMConstantFPValueKind,
      ValueKind::ConstantPointerNull => LLVMValueKind::LLVMConstantPointerNullValueKind,
      ValueKind::ConstantTokenNone => LLVMValueKind::LLVMConstantTokenNoneValueKind,
      ValueKind::MetadataAsValue => LLVMValueKind::LLVMMetadataAsValueValueKind,
      ValueKind::InlineAsm => LLVMValueKind::LLVMInlineAsmValueKind,
      ValueKind::Instruction => LLVMValueKind::LLVMInstructionValueKind,
    }
  }
}