2
0
mirror of https://github.com/m-labs/artiq.git synced 2024-12-19 00:16:29 +08:00

LLVMIRGenerator: implement quoting of lists.

This commit is contained in:
whitequark 2015-08-31 23:33:33 -06:00
parent 956c1985b1
commit 156779007a

View File

@ -1013,28 +1013,42 @@ class LLVMIRGenerator:
else: else:
llfields.append(self._quote(getattr(value, attr), typ.attributes[attr], llfields.append(self._quote(getattr(value, attr), typ.attributes[attr],
lambda: path() + [attr])) lambda: path() + [attr]))
llconst = ll.Constant(llty.pointee, llfields)
llvalue = ll.Constant(llty.pointee, llfields) llglobal = ll.GlobalVariable(self.llmodule, llconst.type, global_name)
llconst = ll.GlobalVariable(self.llmodule, llvalue.type, global_name) llglobal.initializer = llconst
llconst.initializer = llvalue llglobal.linkage = "private"
llconst.linkage = "private" self.llobject_map[value_id] = llglobal
self.llobject_map[value_id] = llconst return llglobal
return llconst
elif builtins.is_none(typ): elif builtins.is_none(typ):
assert value is None assert value is None
return ll.Constant.literal_struct([]) return ll.Constant.literal_struct([])
elif builtins.is_bool(typ): elif builtins.is_bool(typ):
assert value in (True, False) assert value in (True, False)
return ll.Constant(lli1, value) return ll.Constant(llty, value)
elif builtins.is_int(typ): elif builtins.is_int(typ):
assert isinstance(value, (int, language_core.int)) assert isinstance(value, (int, language_core.int))
return ll.Constant(ll.IntType(builtins.get_int_width(typ)), int(value)) return ll.Constant(llty, int(value))
elif builtins.is_float(typ): elif builtins.is_float(typ):
assert isinstance(value, float) assert isinstance(value, float)
return ll.Constant(lldouble, value) return ll.Constant(llty, value)
elif builtins.is_str(typ): elif builtins.is_str(typ):
assert isinstance(value, (str, bytes)) assert isinstance(value, (str, bytes))
return self.llstr_of_str(value) return self.llstr_of_str(value)
elif builtins.is_list(typ):
assert isinstance(value, list)
elt_type = builtins.get_iterable_elt(typ)
llelts = [self._quote(value[i], elt_type, lambda: path() + [str(i)])
for i in range(len(value))]
lleltsary = ll.Constant(ll.ArrayType(llelts[0].type, len(llelts)), llelts)
llglobal = ll.GlobalVariable(self.llmodule, lleltsary.type, "quoted.list")
llglobal.initializer = lleltsary
llglobal.linkage = "private"
lleltsptr = llglobal.bitcast(lleltsary.type.element.as_pointer())
llconst = ll.Constant(llty, [ll.Constant(lli32, len(llelts)), lleltsptr])
return llconst
elif types.is_function(typ): elif types.is_function(typ):
# RPC and C functions have no runtime representation; ARTIQ # RPC and C functions have no runtime representation; ARTIQ
# functions are initialized explicitly. # functions are initialized explicitly.