提交 df774284 编写于 作者: A Andy Polyakov

Mac OS X x86 assembler support.

上级 3e583572
......@@ -170,7 +170,7 @@ sub ::asm_init
$filename=$fn;
$i386=$cpu;
$elf=$cpp=$coff=$aout=$win32=$netware=$mwerks=0;
$elf=$cpp=$coff=$aout=$macosx=$win32=$netware=$mwerks=0;
if (($type eq "elf"))
{ $elf=1; require "x86gas.pl"; }
elsif (($type eq "a\.out"))
......@@ -185,6 +185,8 @@ sub ::asm_init
#{ $netware=1; $mwerks=1; require "x86nasm.pl"; }
elsif (($type eq "win32"))
{ $win32=1; require "x86masm.pl"; }
elsif (($type eq "macosx"))
{ $aout=1; $macosx=1; require "x86gas.pl"; }
else
{ print STDERR <<"EOF";
Pick one target type from
......@@ -193,6 +195,7 @@ Pick one target type from
coff - GAS/COFF such as Win32 targets
win32n - Windows 95/Windows NT NASM format
nw-nasm - NetWare NASM format
macosx - Mac OS X
EOF
exit(1);
}
......
......@@ -125,7 +125,7 @@ sub ::function_begin_B
push(@out,".globl\t$func\n") if ($global);
if ($::coff)
{ push(@out,".def\t$func;\t.scl\t2;\t.type\t32;\t.endef\n"); }
elsif ($::aout and !$::pic)
elsif (($::aout and !$::pic) or $::macosx)
{ }
else
{ push(@out,".type $func,\@function\n"); }
......@@ -171,6 +171,14 @@ sub ::file_end
if ($::elf) { push (@out,"$tmp,4\n"); }
else { push (@out,"$tmp\n"); }
}
if ($::macosx)
{ grep {s/^\.extern\s+.*$//} @out;
if (%non_lazy_ptr)
{ push(@out,".section __IMPORT,__pointers,non_lazy_symbol_pointers\n");
foreach $i (keys %non_lazy_ptr)
{ push(@out,"$non_lazy_ptr{$i}:\n.indirect_symbol\t$i\n.long\t0\n"); }
}
}
push(@out,$initseg) if ($initseg);
}
......@@ -195,14 +203,19 @@ sub ::picmeup
{ &::call(&::label("PIC_me_up"));
&::set_label("PIC_me_up");
&::blindpop($dst);
&::add($dst,"\$${nmdecor}_GLOBAL_OFFSET_TABLE_+[.-".
&::label("PIC_me_up") . "]");
$base=$dst;
$reflabel=&::label("PIC_me_up");
}
if ($::macosx)
{ my $indirect=&::static_label("$nmdecor$sym\$non_lazy_ptr");
&::mov($dst,&::DWP("$indirect-$reflabel",$base));
$non_lazy_ptr{"$nmdecor$sym"}=$indirect;
}
else
{ &::lea($dst,&::DWP("${nmdecor}_GLOBAL_OFFSET_TABLE_+[.-$reflabel]",
$base));
&::mov($dst,&::DWP("$nmdecor$sym\@GOT",$dst));
}
&::mov($dst,&::DWP("$nmdecor$sym\@GOT",$dst));
}
else
{ &::lea($dst,&::DWP($sym)); }
......@@ -224,6 +237,13 @@ ___
{ $initseg.=<<___; # applies to both Cygwin and Mingw
.section .ctors
.long $f
___
}
elsif ($::macosx)
{ $initseg.=<<___;
.mod_init_func
.align 2
.long $f
___
}
elsif ($::aout)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册