forked from scala-native/scala-native
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Attrs.scala
83 lines (70 loc) · 2.67 KB
/
Attrs.scala
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
package scala.scalanative
package nir
import scala.collection.mutable
import nir.Attr._
sealed abstract class Attr {
final def show: String = nir.Show(this)
}
object Attr {
sealed abstract class Inline extends Attr
final case object MayInline extends Inline // no information
final case object InlineHint extends Inline // user hinted at inlining
final case object NoInline extends Inline // should never inline
final case object AlwaysInline extends Inline // should always inline
final case object Dyn extends Attr
final case object Pure extends Attr
final case object Extern extends Attr
final case class Override(name: Global) extends Attr
final case class Align(value: Int) extends Attr
// Linker attributes
final case class Link(name: String) extends Attr
sealed abstract class Pin extends Attr
final case class PinAlways(dep: Global) extends Pin
final case class PinIf(dep: Global, cond: Global) extends Pin
final case class PinWeak(dep: Global) extends Pin
}
final case class Attrs(inline: Inline = MayInline,
isPure: Boolean = false,
isExtern: Boolean = false,
isDyn: Boolean = false,
overrides: Seq[Global] = Seq(),
pins: Seq[Pin] = Seq(),
links: Seq[Attr.Link] = Seq(),
align: Option[Int] = scala.None) {
def toSeq: Seq[Attr] = {
val out = mutable.UnrolledBuffer.empty[Attr]
if (inline != MayInline) out += inline
if (isPure) out += Pure
if (isExtern) out += Extern
if (isDyn) out += Dyn
overrides.foreach { out += Override(_) }
out ++= pins
out ++= links
align.foreach { out += Align(_) }
out
}
}
object Attrs {
val None = new Attrs()
def fromSeq(attrs: Seq[Attr]) = {
var inline = None.inline
var isPure = false
var isExtern = false
var isDyn = false
var align = Option.empty[Int]
val overrides = mutable.UnrolledBuffer.empty[Global]
val pins = mutable.UnrolledBuffer.empty[Pin]
val links = mutable.UnrolledBuffer.empty[Attr.Link]
attrs.foreach {
case attr: Inline => inline = attr
case Pure => isPure = true
case Extern => isExtern = true
case Dyn => isDyn = true
case Align(value) => align = Some(value)
case Override(name) => overrides += name
case attr: Pin => pins += attr
case link: Attr.Link => links += link
}
new Attrs(inline, isPure, isExtern, isDyn, overrides, pins, links, align)
}
}