mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 22:14:25 +02:00
llvm: support for adding/subtracting constants to pointers in typed constants
Fixes webtbs/tw34027 for llvm
This commit is contained in:
parent
573f2c20d7
commit
70908b1449
@ -428,10 +428,10 @@ type
|
|||||||
function queue_subscriptn_multiple_by_name(def: tabstractrecorddef; const fields: array of TIDString): tdef;
|
function queue_subscriptn_multiple_by_name(def: tabstractrecorddef; const fields: array of TIDString): tdef;
|
||||||
{ queue a type conversion operation }
|
{ queue a type conversion operation }
|
||||||
procedure queue_typeconvn(fromdef, todef: tdef); virtual;
|
procedure queue_typeconvn(fromdef, todef: tdef); virtual;
|
||||||
{ queue a add operation }
|
{ queue a pointer add operation }
|
||||||
procedure queue_addn(def: tdef; const index: tconstexprint); virtual;
|
procedure queue_pointeraddn(def: tpointerdef; const index: tconstexprint); virtual;
|
||||||
{ queue a sub operation }
|
{ queue a pointer sub operation }
|
||||||
procedure queue_subn(def: tdef; const index: tconstexprint); virtual;
|
procedure queue_pointersubn(def: tpointerdef; const index: tconstexprint); virtual;
|
||||||
{ finalise the queue (so a new one can be created) and flush the
|
{ finalise the queue (so a new one can be created) and flush the
|
||||||
previously queued operations, applying them in reverse order on a...}
|
previously queued operations, applying them in reverse order on a...}
|
||||||
{ ... procdef }
|
{ ... procdef }
|
||||||
@ -2107,15 +2107,15 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure ttai_typedconstbuilder.queue_addn(def: tdef; const index: tconstexprint);
|
procedure ttai_typedconstbuilder.queue_pointeraddn(def: tpointerdef; const index: tconstexprint);
|
||||||
begin
|
begin
|
||||||
inc(fqueue_offset,def.size*int64(index));
|
inc(fqueue_offset,def.pointeddef.size*int64(index));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure ttai_typedconstbuilder.queue_subn(def: tdef; const index: tconstexprint);
|
procedure ttai_typedconstbuilder.queue_pointersubn(def: tpointerdef; const index: tconstexprint);
|
||||||
begin
|
begin
|
||||||
dec(fqueue_offset,def.size*int64(index));
|
dec(fqueue_offset,def.pointeddef.size*int64(index));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
@ -106,6 +106,8 @@ interface
|
|||||||
procedure emit_dynarray_offset(const ll: tasmlabofs; const arrlength: asizeint; const arrdef: tarraydef; const arrconstdatadef: trecorddef); override;
|
procedure emit_dynarray_offset(const ll: tasmlabofs; const arrlength: asizeint; const arrdef: tarraydef; const arrconstdatadef: trecorddef); override;
|
||||||
procedure queue_init(todef: tdef); override;
|
procedure queue_init(todef: tdef); override;
|
||||||
procedure queue_vecn(def: tdef; const index: tconstexprint); override;
|
procedure queue_vecn(def: tdef; const index: tconstexprint); override;
|
||||||
|
procedure queue_pointeraddn(def: tpointerdef; const index: tconstexprint); override;
|
||||||
|
procedure queue_pointersubn(def: tpointerdef; const index: tconstexprint); override;
|
||||||
procedure queue_subscriptn(def: tabstractrecorddef; vs: tfieldvarsym); override;
|
procedure queue_subscriptn(def: tabstractrecorddef; vs: tfieldvarsym); override;
|
||||||
procedure queue_typeconvn(fromdef, todef: tdef); override;
|
procedure queue_typeconvn(fromdef, todef: tdef); override;
|
||||||
procedure queue_emit_staticvar(vs: tstaticvarsym); override;
|
procedure queue_emit_staticvar(vs: tstaticvarsym); override;
|
||||||
@ -671,6 +673,28 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure tllvmtai_typedconstbuilder.queue_pointeraddn(def: tpointerdef; const index: tconstexprint);
|
||||||
|
begin
|
||||||
|
queue_pointersubn(def, -index);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure tllvmtai_typedconstbuilder.queue_pointersubn(def: tpointerdef; const index: tconstexprint);
|
||||||
|
var
|
||||||
|
ai: taillvm;
|
||||||
|
aityped: tai;
|
||||||
|
begin
|
||||||
|
{ update range checking info }
|
||||||
|
inherited;
|
||||||
|
if index.svalue<>low(int64) then
|
||||||
|
ai:=taillvm.getelementptr_reg_tai_size_const(NR_NO,nil,ptrsinttype,-index.svalue,false)
|
||||||
|
else
|
||||||
|
ai:=taillvm.getelementptr_reg_tai_size_const(NR_NO,nil,ptrsinttype,index.svalue,false);
|
||||||
|
aityped:=wrap_with_type(ai,def);
|
||||||
|
update_queued_tai(def,aityped,ai,1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure tllvmtai_typedconstbuilder.queue_subscriptn(def: tabstractrecorddef; vs: tfieldvarsym);
|
procedure tllvmtai_typedconstbuilder.queue_subscriptn(def: tabstractrecorddef; vs: tfieldvarsym);
|
||||||
var
|
var
|
||||||
getllvmfieldaddr,
|
getllvmfieldaddr,
|
||||||
|
@ -952,7 +952,7 @@ function get_next_varsym(def: tabstractrecorddef; const SymList:TFPHashObjectLis
|
|||||||
is_constcharnode(taddnode(hp).right) or
|
is_constcharnode(taddnode(hp).right) or
|
||||||
is_constboolnode(taddnode(hp).right)) and
|
is_constboolnode(taddnode(hp).right)) and
|
||||||
is_pointer(taddnode(hp).left.resultdef) then
|
is_pointer(taddnode(hp).left.resultdef) then
|
||||||
ftcb.queue_addn(tpointerdef(taddnode(hp).left.resultdef).pointeddef,get_ordinal_value(taddnode(hp).right))
|
ftcb.queue_pointeraddn(tpointerdef(taddnode(hp).left.resultdef),get_ordinal_value(taddnode(hp).right))
|
||||||
else
|
else
|
||||||
Message(parser_e_illegal_expression);
|
Message(parser_e_illegal_expression);
|
||||||
end;
|
end;
|
||||||
@ -963,7 +963,7 @@ function get_next_varsym(def: tabstractrecorddef; const SymList:TFPHashObjectLis
|
|||||||
is_constcharnode(taddnode(hp).right) or
|
is_constcharnode(taddnode(hp).right) or
|
||||||
is_constboolnode(taddnode(hp).right)) and
|
is_constboolnode(taddnode(hp).right)) and
|
||||||
is_pointer(taddnode(hp).left.resultdef) then
|
is_pointer(taddnode(hp).left.resultdef) then
|
||||||
ftcb.queue_subn(tpointerdef(taddnode(hp).left.resultdef).pointeddef,get_ordinal_value(taddnode(hp).right))
|
ftcb.queue_pointersubn(tpointerdef(taddnode(hp).left.resultdef),get_ordinal_value(taddnode(hp).right))
|
||||||
else
|
else
|
||||||
Message(parser_e_illegal_expression);
|
Message(parser_e_illegal_expression);
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user