~ubuntu-branches/ubuntu/feisty/fpc/feisty

« back to all changes in this revision

Viewing changes to compiler/powerpc/nppcld.pas

  • Committer: Bazaar Package Importer
  • Author(s): Torsten Werner
  • Date: 2007-01-27 20:08:50 UTC
  • mfrom: (1.2.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20070127200850-9mrptaqqjsx9nwa7
Tags: 2.0.4-5
* Fixed Build-Depends.
* Add myself to Uploaders in debian/control.
* Make sure that the sources are really patched before building them.
* Build unit 'libc' on powerpc too.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
{
2
 
    $Id: nppcld.pas,v 1.9 2005/02/14 17:13:10 peter Exp $
3
2
    Copyright (c) 1998-2002 by Florian Klaempfl
4
3
 
5
4
    Generate ppc assembler for nodes that handle loads and assignments
32
31
    type
33
32
      tppcloadnode = class(tcgloadnode)
34
33
        procedure pass_2; override;
35
 
        procedure generate_picvaraccess;override;
36
34
      end;
37
35
 
38
36
 
41
39
    uses
42
40
      verbose,
43
41
      systems,
44
 
      cpubase,
45
 
      cgutils,cgobj,
46
 
      aasmbase,aasmtai,
 
42
      globtype,globals,defutil,
 
43
      cpubase, aasmbase, aasmtai,
 
44
      cgutils,cgbase,cgobj,cgcpu,
47
45
      symconst,symsym,
48
46
      procinfo,
49
47
      nld;
53
51
      var
54
52
        l : tasmsymbol;
55
53
        ref : treference;
 
54
        symname: string;
56
55
      begin
 
56
        symname := '';
57
57
        case target_info.system of
58
58
          system_powerpc_darwin:
59
59
            begin
60
 
              if (symtableentry.typ = procsym) and
61
 
                 (tprocsym(symtableentry).owner.symtabletype in [staticsymtable,globalsymtable]) and
62
 
                 (
63
 
                  (not tprocsym(symtableentry).owner.iscurrentunit) or
64
 
                  (po_external in tprocsym(symtableentry).procdef[1].procoptions)
65
 
                 ) then
66
 
                begin
67
 
                  l:=objectlibrary.getasmsymbol('L'+tprocsym(symtableentry).procdef[1].mangledname+'$non_lazy_ptr');
68
 
                  if not(assigned(l)) then
69
 
                    begin
70
 
                      l:=objectlibrary.newasmsymbol('L'+tprocsym(symtableentry).procdef[1].mangledname+'$non_lazy_ptr',AB_COMMON,AT_DATA);
71
 
                      picdata.concat(tai_symbol.create(l,0));
72
 
                      picdata.concat(tai_const.create_indirect_sym(objectlibrary.newasmsymbol(tprocsym(symtableentry).procdef[1].mangledname,AB_EXTERNAL,AT_DATA)));
73
 
                      picdata.concat(tai_const.create_32bit(0));
74
 
                    end;
75
 
                  reference_reset_symbol(ref,l,0);
76
 
                  reference_reset_base(location.reference,cg.getaddressregister(exprasmlist),0);
77
 
                  cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,ref,location.reference.base);
78
 
                end
79
 
              else
80
 
                inherited pass_2;
 
60
              case symtableentry.typ of
 
61
                procsym:
 
62
                  begin
 
63
                    if (po_external in tprocsym(symtableentry).procdef[1].procoptions) then
 
64
                      symname := tprocsym(symtableentry).procdef[1].mangledname;
 
65
                  end;
 
66
                globalvarsym:
 
67
                  begin
 
68
                    if ([vo_is_dll_var,vo_is_external] * tglobalvarsym(symtableentry).varoptions <> []) then
 
69
                      symname := tglobalvarsym(symtableentry).mangledname;
 
70
                  end;
 
71
              end;
81
72
            end;
82
 
          else
83
 
            inherited pass_2;
84
 
        end;
85
 
      end;
86
 
 
87
 
    procedure tppcloadnode.generate_picvaraccess;
88
 
      var
89
 
        l : tasmsymbol;
90
 
        ref : treference;
91
 
      begin
92
 
        case target_info.system of
93
 
          system_powerpc_darwin:
94
 
            begin
95
 
              if (vo_is_dll_var in tglobalvarsym(symtableentry).varoptions) or
96
 
                 ((tglobalvarsym(symtableentry).owner.symtabletype in [staticsymtable,globalsymtable]) and
97
 
                  not(tglobalvarsym(symtableentry).owner.iscurrentunit)) then
98
 
                begin
99
 
                  l:=objectlibrary.getasmsymbol('L'+tglobalvarsym(symtableentry).mangledname+'$non_lazy_ptr');
100
 
                  if not(assigned(l)) then
101
 
                    begin
102
 
                      l:=objectlibrary.newasmsymbol('L'+tglobalvarsym(symtableentry).mangledname+'$non_lazy_ptr',AB_COMMON,AT_DATA);
103
 
                      picdata.concat(tai_symbol.create(l,0));
104
 
                      picdata.concat(tai_const.create_indirect_sym(objectlibrary.newasmsymbol(tglobalvarsym(symtableentry).mangledname,AB_EXTERNAL,AT_DATA)));
105
 
                      picdata.concat(tai_const.create_32bit(0));
106
 
                    end;
107
 
 
108
 
                  reference_reset_symbol(ref,l,0);
109
 
{                  ref.base:=current_procinfo.got;
110
 
                  ref.relsymbol:=current_procinfo.gotlabel;}
111
 
                  reference_reset_base(location.reference,cg.getaddressregister(exprasmlist),0);
112
 
                  cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,ref,location.reference.base);
113
 
                end
114
 
              else
115
 
                internalerror(200403021);
116
 
            end
117
 
          else
118
 
            internalerror(200402291);
119
 
        end;
120
 
      end;
121
 
 
 
73
        end;
 
74
        if (symname = '') then
 
75
          inherited pass_2
 
76
        else
 
77
          begin
 
78
            location_reset(location,LOC_REFERENCE,def_cgsize(resulttype.def));
 
79
            reference_reset_base(location.reference,cg.getaddressregister(exprasmlist),0);
 
80
            location.reference.base := tcgppc(cg).g_darwin_indirect_sym_load(exprasmlist,symname);
 
81
          end;
 
82
      end;
 
83
      
122
84
 
123
85
begin
124
86
   cloadnode:=tppcloadnode;
125
87
end.
126
 
{
127
 
  $Log: nppcld.pas,v $
128
 
  Revision 1.9  2005/02/14 17:13:10  peter
129
 
    * truncate log
130
 
 
131
 
  Revision 1.8  2005/01/24 18:13:46  jonas
132
 
    * fixed bug introduced in revision 1.6
133
 
 
134
 
  Revision 1.7  2005/01/20 17:47:01  peter
135
 
    * remove copy_value_on_stack and a_param_copy_ref
136
 
 
137
 
  Revision 1.6  2005/01/19 22:19:41  peter
138
 
    * unit mapping rewrite
139
 
    * new derefmap added
140
 
 
141
 
}