@@ -418,17 +418,9 @@ def process(self, functions, attribute_writeback):
418
418
return self .llmodule
419
419
420
420
def emit_attribute_writeback (self ):
421
- llobjects = []
422
- shadow_memory_dim = defaultdict (lambda : 0 )
421
+ llobjects = defaultdict (lambda : [])
423
422
424
423
for obj_id in self .object_map :
425
- while len (llobjects ) <= obj_id :
426
- llobjects .append (ll .Constant (llptr , None ))
427
-
428
- llobject = self .llmodule .get_global ("object.{}" .format (obj_id ))
429
- if llobject is not None :
430
- llobjects [obj_id ] = llobject .bitcast (llptr )
431
-
432
424
obj_ref = self .object_map .retrieve (obj_id )
433
425
if isinstance (obj_ref , (pytypes .FunctionType , pytypes .MethodType )):
434
426
continue
@@ -437,19 +429,20 @@ def emit_attribute_writeback(self):
437
429
else :
438
430
typ , _ = self .type_map [type (obj_ref )]
439
431
440
- if shadow_memory_dim [typ ] <= obj_id :
441
- shadow_memory_dim [typ ] = obj_id + 1
432
+ llobject = self .llmodule .get_global ("object.{}" .format (obj_id ))
433
+ if llobject is not None :
434
+ llobjects [typ ].append (llobject .bitcast (llptr ))
442
435
443
436
lldatalayout = llvm .create_target_data (self .llmodule .data_layout )
444
437
445
- llrpcattrty = self .llcontext .get_identified_type ("shadow.attr " )
438
+ llrpcattrty = self .llcontext .get_identified_type ("attr_desc " )
446
439
llrpcattrty .elements = [lli32 , llptr , llptr ]
447
440
448
- lldescty = self .llcontext .get_identified_type ("shadow.desc " )
449
- lldescty .elements = [llrpcattrty .as_pointer ().as_pointer (), lli32 , llptr ]
441
+ lldescty = self .llcontext .get_identified_type ("type_desc " )
442
+ lldescty .elements = [llrpcattrty .as_pointer ().as_pointer (), llptr . as_pointer () ]
450
443
451
444
lldescs = []
452
- for typ in shadow_memory_dim :
445
+ for typ in llobjects :
453
446
if "__objectid__" not in typ .attributes :
454
447
continue
455
448
@@ -458,44 +451,25 @@ def emit_attribute_writeback(self):
458
451
else :
459
452
type_name = "instance.{}" .format (typ .name )
460
453
461
- shadowname = "shadow.{}" .format (type_name )
462
- llshadow = self .llmodule .get_global (shadowname )
463
- if llshadow is None :
464
- continue
465
-
466
- llshadowlen = shadow_memory_dim [typ ] * len (typ .attributes )
467
- llshadowty = ll .ArrayType (lli8 , llshadowlen )
468
- llshadow .gtype = llshadowty
469
- llshadow .type = llshadowty .as_pointer ()
470
- llshadow .initializer = ll .Constant (llshadowty , None )
471
-
472
454
def llrpcattr_of_attr (name , typ ):
473
- llty = self .llty_of_type (typ )
474
- if isinstance (llty , ll .PointerType ):
475
- # Work around llvmlite bug where it is unable to get a C++
476
- # object for a type if it includes an identified type in a context
477
- # other than the default.
478
- size = llptr .get_abi_size (lldatalayout )
479
- else :
480
- size = llty .get_abi_size (lldatalayout )
455
+ size = self .llty_of_type (typ ).get_abi_size (lldatalayout , context = self .llcontext )
481
456
482
457
def rpc_tag_error (typ ):
483
458
print (typ )
484
459
assert False
485
460
486
- rpctag = b"Os"
487
- if not (types .is_function (typ ) or types .is_method (typ )):
488
- rpctag += self ._rpc_tag (typ , error_handler = rpc_tag_error )
461
+ if not (types .is_function (typ ) or types .is_method (typ ) or
462
+ name == "__objectid__" ):
463
+ rpctag = b"Os" + self ._rpc_tag (typ , error_handler = rpc_tag_error ) + b":n\x00 "
464
+ llrpctag = self .llstr_of_str (rpctag )
489
465
else :
490
- rpctag += b""
491
- rpctag += b":n\x00 "
492
- llrpctag = self .llstr_of_str (rpctag )
466
+ llrpctag = ll .Constant (llptr , None )
493
467
494
468
llrpcattr = ll .GlobalVariable (self .llmodule , llrpcattrty ,
495
- name = "shadow. attr.{}.{}" .format (type_name , name ))
469
+ name = "attr.{}.{}" .format (type_name , name ))
496
470
llrpcattr .initializer = ll .Constant (llrpcattrty , [
497
471
ll .Constant (lli32 , size ),
498
- self . llstr_of_str ( rpctag ) ,
472
+ llrpctag ,
499
473
self .llstr_of_str (name )
500
474
])
501
475
llrpcattr .global_constant = True
@@ -509,33 +483,36 @@ def rpc_tag_error(typ):
509
483
510
484
llrpcattraryty = ll .ArrayType (llrpcattrty .as_pointer (), len (llrpcattrs ) + 1 )
511
485
llrpcattrary = ll .GlobalVariable (self .llmodule , llrpcattraryty ,
512
- name = "shadow. attrs.{}" .format (type_name ))
486
+ name = "attrs.{}" .format (type_name ))
513
487
llrpcattrary .initializer = ll .Constant (llrpcattraryty ,
514
488
llrpcattrs + [ll .Constant (llrpcattrty .as_pointer (), None )])
515
489
llrpcattrary .global_constant = True
516
490
llrpcattrary .unnamed_addr = True
517
491
llrpcattrary .linkage = 'internal'
518
492
493
+ llobjectaryty = ll .ArrayType (llptr , len (llobjects [typ ]) + 1 )
494
+ llobjectary = ll .GlobalVariable (self .llmodule , llobjectaryty ,
495
+ name = "objects.{}" .format (type_name ))
496
+ llobjectary .initializer = ll .Constant (llobjectaryty ,
497
+ llobjects [typ ] + [ll .Constant (llptr , None )])
498
+ llobjectary .linkage = 'internal'
499
+
519
500
lldesc = ll .GlobalVariable (self .llmodule , lldescty ,
520
- name = "shadow. desc.{}" .format (type_name ))
501
+ name = "desc.{}" .format (type_name ))
521
502
lldesc .initializer = ll .Constant (lldescty , [
522
503
llrpcattrary .bitcast (llrpcattrty .as_pointer ().as_pointer ()),
523
- ll .Constant (lli32 , shadow_memory_dim [typ ]),
524
- llshadow .bitcast (llptr )
504
+ llobjectary .bitcast (llptr .as_pointer ())
525
505
])
526
506
lldesc .global_constant = True
527
507
lldesc .linkage = 'internal'
528
508
lldescs .append (lldesc )
529
509
530
510
llglobaldescty = ll .ArrayType (lldescty .as_pointer (), len (lldescs ) + 1 )
531
- llglobaldesc = ll .GlobalVariable (self .llmodule , llglobaldescty , name = "shadow" )
511
+ llglobaldesc = ll .GlobalVariable (self .llmodule , llglobaldescty ,
512
+ name = "typeinfo" )
532
513
llglobaldesc .initializer = ll .Constant (llglobaldescty ,
533
514
lldescs + [ll .Constant (lldescty .as_pointer (), None )])
534
515
535
- llobjectaryty = ll .ArrayType (llptr , len (llobjects ))
536
- llobjectary = ll .GlobalVariable (self .llmodule , llobjectaryty , name = "objects" )
537
- llobjectary .initializer = ll .Constant (llobjectaryty , llobjects )
538
-
539
516
def process_function (self , func ):
540
517
try :
541
518
self .llfunction = self .llmodule .get_global (func .name )
@@ -695,34 +672,6 @@ def process_GetAttr(self, insn):
695
672
696
673
def process_SetAttr (self , insn ):
697
674
assert builtins .is_allocated (insn .object ().type )
698
-
699
- object_type = insn .object ().type .find ()
700
- value_type = insn .value ().type .find ()
701
- if "__objectid__" in object_type .attributes and \
702
- not (types .is_function (value_type ) or types .is_method (value_type )):
703
- llidptr = self .llbuilder .gep (self .map (insn .object ()),
704
- [self .llindex (0 ), self .llindex (0 )])
705
- llid = self .llbuilder .load (llidptr , name = "shadow.id" )
706
- llattrcount = ll .Constant (lli32 , len (object_type .attributes ))
707
- llshadowpos = self .llbuilder .add (
708
- self .llbuilder .mul (llid , llattrcount ),
709
- ll .Constant (lli32 , self .attr_index (insn )))
710
-
711
- if types .is_constructor (object_type ):
712
- shadowname = "shadow.class.{}" .format (object_type .name )
713
- else :
714
- shadowname = "shadow.instance.{}" .format (object_type .name )
715
-
716
- llshadow = self .llmodule .get_global (shadowname )
717
- if llshadow is None :
718
- llshadowty = ll .ArrayType (lli8 , 0 )
719
- llshadow = ll .GlobalVariable (self .llmodule , llshadowty , shadowname )
720
- llshadow .linkage = 'internal'
721
-
722
- llshadowptr = self .llbuilder .gep (llshadow , [self .llindex (0 ), llshadowpos ],
723
- name = "shadow.ptr" )
724
- self .llbuilder .store (ll .Constant (lli8 , 1 ), llshadowptr )
725
-
726
675
llptr = self .llbuilder .gep (self .map (insn .object ()),
727
676
[self .llindex (0 ), self .llindex (self .attr_index (insn ))],
728
677
name = insn .name )
0 commit comments