///|
pub(all) struct GlobalValue {
  label : String
  content : GlobalValueContent
  mod : Module
  mut llvm_gv : &@IR.GlobalValue?
}

///|
pub(all) enum GlobalValueContent {
  String(String)
  Zero(UInt) // size in bytes
  Data(Array[GlobalValueData])
}

///|
pub(all) enum GlobalValueData {
  Quad(UInt64)
  Word(UInt)
  Half(UInt16)
  Byte(Byte)
}

///|
pub impl Show for GlobalValue with output(self, logger) {
  logger.write_string("global \{self.label} {\n")
  match self.content {
    String(s) => logger.write_string("  \"\{s}\"\n")
    Zero(size) => logger.write_string("  .zero \{size}\n")
    Data(data) =>
      for d in data {
        match d {
          Quad(q) => logger.write_string("  .quad \{q}\n")
          Word(w) => logger.write_string("  .word \{w}\n")
          Half(h) => logger.write_string("  .half \{h}\n")
          Byte(b) => logger.write_string("  .byte \{b.to_int()}\n")
        }
      }
  }
  logger.write_string("}\n")
}