Skip to content

Commit b26b894

Browse files
committed
impl AnyValue & BasicValue for GlobalValue as they are always PointerValues.
Fixes rust-lang#26
1 parent 7895037 commit b26b894

File tree

3 files changed

+12
-6
lines changed

3 files changed

+12
-6
lines changed

src/values/global_value.rs

+7-3
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ use std::ffi::{CString, CStr};
66

77
use {GlobalVisibility, ThreadLocalMode, DLLStorageClass};
88
use values::traits::AsValueRef;
9-
use values::{BasicValueEnum, BasicValue, Value};
9+
use values::{BasicValueEnum, BasicValue, PointerValue, Value};
1010

11-
// REVIEW: GlobalValues may always be PointerValues, in which case we can
12-
// simplify from BasicValueEnum down to PointerValue
11+
// REVIEW: GlobalValues are always PointerValues. With SubTypes, we should
12+
// compress this into a PointerValue<Global> type
1313
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
1414
pub struct GlobalValue {
1515
global_value: Value,
@@ -189,6 +189,10 @@ impl GlobalValue {
189189
pub unsafe fn delete(self) {
190190
LLVMDeleteGlobal(self.as_value_ref())
191191
}
192+
193+
pub fn as_pointer_value(&self) -> PointerValue {
194+
PointerValue::new(self.as_value_ref())
195+
}
192196
}
193197

194198
impl AsValueRef for GlobalValue {

src/values/traits.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use llvm_sys::prelude::LLVMValueRef;
22

33
use std::fmt::Debug;
44

5-
use values::{ArrayValue, AggregateValueEnum, StructValue, BasicValueEnum, AnyValueEnum, IntValue, FloatValue, PointerValue, PhiValue, VectorValue, FunctionValue, InstructionValue};
5+
use values::{ArrayValue, AggregateValueEnum, GlobalValue, StructValue, BasicValueEnum, AnyValueEnum, IntValue, FloatValue, PointerValue, PhiValue, VectorValue, FunctionValue, InstructionValue};
66

77
// This is an ugly privacy hack so that Type can stay private to this module
88
// and so that super traits using this trait will be not be implementable
@@ -47,5 +47,5 @@ pub trait AnyValue: AsValueRef + Debug {
4747
}
4848

4949
trait_value_set! {AggregateValue: ArrayValue, AggregateValueEnum, StructValue}
50-
trait_value_set! {AnyValue: AnyValueEnum, BasicValueEnum, AggregateValueEnum, ArrayValue, IntValue, FloatValue, PhiValue, PointerValue, FunctionValue, StructValue, VectorValue, InstructionValue}
51-
trait_value_set! {BasicValue: ArrayValue, BasicValueEnum, AggregateValueEnum, IntValue, FloatValue, StructValue, PointerValue, VectorValue}
50+
trait_value_set! {AnyValue: AnyValueEnum, BasicValueEnum, AggregateValueEnum, ArrayValue, IntValue, FloatValue, GlobalValue, PhiValue, PointerValue, FunctionValue, StructValue, VectorValue, InstructionValue}
51+
trait_value_set! {BasicValue: ArrayValue, BasicValueEnum, AggregateValueEnum, IntValue, FloatValue, GlobalValue, StructValue, PointerValue, VectorValue}

tests/test_values.rs

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ use self::inkwell::values::{MetadataValue, FIRST_CUSTOM_METADATA_KIND_ID};
99

1010
use std::ffi::CString;
1111

12+
// TODO: Test GlobalValues used as PointerValues
13+
1214
#[test]
1315
fn test_linkage() {
1416
let context = Context::create();

0 commit comments

Comments
 (0)