-
Notifications
You must be signed in to change notification settings - Fork 68
/
llvm-value.dylan
90 lines (73 loc) · 2.29 KB
/
llvm-value.dylan
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
Module: llvm-internals
Author: Peter S. Housel
Copyright: Original Code is Copyright 2009-2010 Gwydion Dylan Maintainers
All rights reserved.
License: See License.txt in this distribution for details.
Warranty: Distributed WITHOUT WARRANTY OF ANY KIND
define abstract class <llvm-value> (<object>)
end class;
define generic llvm-value-type
(value :: <llvm-value>) => (type :: <llvm-type>);
define generic value-forward
(value :: <llvm-value>)
=> (value :: <llvm-value>);
define method value-forward
(value :: <llvm-value>)
=> (value :: <llvm-value>);
value
end method;
define generic value-partition-key
(value :: <llvm-value>)
=> (key :: <vector>);
// Default method
define method value-partition-key
(value :: <llvm-value>)
=> (key :: <vector>);
vector(object-class(value))
end method;
define generic value-referenced-values
(value :: <llvm-value>)
=> (referenced :: <sequence>);
// Default method
define method value-referenced-values
(value :: <llvm-value>)
=> (referenced :: <vector>);
#[]
end method;
define generic value-referenced-types
(value :: <llvm-value>)
=> (referenced :: <sequence>);
// Default method
define method value-referenced-types
(value :: <llvm-value>)
=> (referenced :: <vector>);
vector(llvm-value-type(value))
end method;
define generic value-referenced-metadata
(value :: <llvm-value>)
=> (referenced :: <sequence>);
// Default method
define method value-referenced-metadata
(value :: <llvm-value>)
=> (referenced :: <vector>);
#[]
end method;
/// Placeholder values
define abstract class <llvm-placeholder-value> (<llvm-value>)
slot llvm-placeholder-value-forward :: <llvm-value>;
end class;
define class <llvm-symbolic-value> (<llvm-placeholder-value>)
constant slot llvm-value-type :: <llvm-type> = make(<llvm-opaque-type>),
init-keyword: type:;
constant slot llvm-symbolic-value-name :: type-union(<string>, <integer>),
required-init-keyword: name:;
end class;
define method value-forward
(value :: <llvm-symbolic-value>)
=> (value :: <llvm-value>);
if (slot-initialized?(value, llvm-placeholder-value-forward))
value-forward(value.llvm-placeholder-value-forward)
else
error("value %s is not defined", value.llvm-symbolic-value-name);
end if
end method;