123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- {
- Copyright (c) 2016 by Jonas Maebe
- This unit implements Objective-C assembler helper routines.
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- ****************************************************************************
- }
- {$i fpcdefs.inc}
- unit objcasm;
- interface
- uses
- aasmbase;
- { Workaround for mantis #29906: bug in PPC jump table generation if a jump
- table is created for a case-statement that handles at least the lowest
- and highest possible value of the case expression type }
- {$ifndef VER3_0_0}
- function objc_section_name(sec: TObjCAsmSectionType): string;
- {$else}
- function objc_section_name(sec: TAsmSectionType): string;
- {$endif}
- implementation
- uses
- verbose,
- systems;
- {$ifndef VER3_0_0}
- function objc_section_name(sec: TObjCAsmSectionType): string;
- {$else}
- function objc_section_name(sec: TAsmSectionType): string;
- {$endif}
- begin
- result:='';
- if target_info.system in systems_darwin then
- case sec of
- sec_objc_protocol:
- begin
- if not(target_info.system in systems_objc_nfabi) then
- result:='__OBJC, __protocol, regular, no_dead_strip'
- else
- internalerror(2015010605);
- end;
- sec_objc_protocol_ext:
- begin
- result:='__OBJC, __protocol_ext, regular, no_dead_strip';
- end;
- sec_objc_category:
- begin
- if not(target_info.system in systems_objc_nfabi) then
- result:='__OBJC, __category, regular, no_dead_strip'
- else
- internalerror(2015010606);
- end;
- sec_objc_class_ext:
- begin
- result:='__OBJC, __class_ext, regular, no_dead_strip';
- end;
- sec_objc_property:
- begin
- result:='__OBJC, __property, regular, no_dead_strip';
- end;
- sec_objc_image_info:
- begin
- if target_info.system in systems_objc_nfabi then
- result:='__DATA, __objc_imageinfo, regular, no_dead_strip'
- else
- result:='__OBJC, __image_info, regular, no_dead_strip';
- end;
- sec_objc_cstring_object:
- begin
- result:='__OBJC, __cstring_object, regular, no_dead_strip';
- end;
- sec_objc_sel_fixup:
- begin
- result:='__OBJC, __sel_fixup, regular, no_dead_strip';
- exit;
- end;
- sec_objc_message_refs:
- begin
- if target_info.system in systems_objc_nfabi then
- result:='__DATA, __objc_selrefs, literal_pointers, no_dead_strip'
- else
- result:='__OBJC, __message_refs, literal_pointers, no_dead_strip';
- end;
- sec_objc_symbols:
- begin
- if not(target_info.system in systems_objc_nfabi) then
- result:='__OBJC, __symbols, regular, no_dead_strip'
- else
- internalerror(2016010603);
- end;
- sec_objc_instance_vars:
- begin
- if target_info.system in systems_objc_nfabi then
- result:='__DATA, __objc_const'
- else
- result:=' __OBJC, __instance_vars, regular, no_dead_strip';
- end;
- sec_objc_cls_refs:
- begin
- if target_info.system in systems_objc_nfabi then
- result:='__DATA, __objc_clsrefs, regular, no_dead_strip'
- else
- result:='__OBJC, __cls_refs, literal_pointers, no_dead_strip';
- end;
- sec_objc_meth_var_types:
- begin
- if target_info.system in systems_objc_nfabi then
- result:='__TEXT, __objc_methtype, cstring_literals'
- else
- result:='__TEXT, __cstring, cstring_literals';
- end;
- sec_objc_meth_var_names:
- begin
- if target_info.system in systems_objc_nfabi then
- result:='__TEXT, __objc_methname, cstring_literals'
- else
- result:='__TEXT, __cstring, cstring_literals';
- end;
- sec_objc_class_names:
- begin
- if target_info.system in systems_objc_nfabi then
- result:='__TEXT, __objc_classname, cstring_literals'
- else
- result:='__TEXT, __cstring, cstring_literals';
- end;
- sec_objc_inst_meth:
- begin
- if target_info.system in systems_objc_nfabi then
- result:='__DATA, __objc_const'
- else
- result:='__OBJC, __inst_meth, regular, no_dead_strip';
- end;
- sec_objc_cls_meth:
- begin
- if target_info.system in systems_objc_nfabi then
- result:='__DATA, __objc_const'
- else
- result:='__OBJC, __cls_meth, regular, no_dead_strip';
- end;
- sec_objc_cat_inst_meth:
- begin
- if target_info.system in systems_objc_nfabi then
- result:='__DATA, __objc_const'
- else
- result:='__OBJC, __cat_inst_meth, regular, no_dead_strip';
- end;
- sec_objc_cat_cls_meth:
- begin
- if target_info.system in systems_objc_nfabi then
- result:='__DATA, __objc_const'
- else
- result:='__OBJC, __cat_cls_meth, regular, no_dead_strip';
- end;
- sec_objc_meta_class:
- begin
- if target_info.system in systems_objc_nfabi then
- result:='__DATA, __objc_const'
- else
- result:='__OBJC, __meta_class, regular, no_dead_strip';
- end;
- sec_objc_class:
- begin
- if target_info.system in systems_objc_nfabi then
- result:='__DATA, __objc_const'
- else
- result:='__OBJC, __class, regular, no_dead_strip';
- end;
- sec_objc_sup_refs:
- begin
- result:='__DATA, __objc_superrefs, regular, no_dead_strip';
- end;
- sec_objc_classlist:
- begin
- result:='__DATA, __objc_classlist, regular, no_dead_strip';
- end;
- sec_objc_nlclasslist:
- begin
- result:='__DATA, __objc_nlclasslist, regular, no_dead_strip';
- end;
- sec_objc_catlist:
- begin
- result:='__DATA, __objc_catlist, regular, no_dead_strip';
- end;
- sec_objc_nlcatlist:
- begin
- result:='__DATA, __objc_nlcatlist, regular, no_dead_strip';
- end;
- sec_objc_protolist:
- begin
- result:='__DATA, __objc_protolist, coalesced, no_dead_strip';
- end;
- sec_objc_module_info:
- begin
- if not(target_info.system in systems_objc_nfabi) then
- result:=' __OBJC, __module_info, regular, no_dead_strip'
- else
- internalerror(2016010601);
- end;
- sec_objc_data:
- begin
- result:='__DATA, __objc_data';
- end;
- sec_objc_const:
- begin
- result:='__DATA, __objc_const';
- end;
- sec_data_coalesced:
- begin
- result:='__DATA, __datacoal_nt, coalesced';
- end;
- else
- internalerror(2016010101);
- end
- else
- internalerror(2016010102);
- end;
- end.
|