x86_64cpuid.pl: allow shared build to work without -Bsymbolic.
authorAndy Polyakov <appro@openssl.org>
Wed, 18 May 2011 16:24:19 +0000 (16:24 +0000)
committerAndy Polyakov <appro@openssl.org>
Wed, 18 May 2011 16:24:19 +0000 (16:24 +0000)
PR: 2466

crypto/perlasm/x86_64-xlate.pl
crypto/x86_64cpuid.pl

index 61d77d941e8ec4a59edb946bffe848b293315f63..6749783e2942199a12677e5cdf12d4049a3cdcf1 100755 (executable)
@@ -508,6 +508,11 @@ my %globals;
                    }
                } elsif ($dir =~ /\.(text|data)/) {
                    $current_segment=".$1";
+               } elsif ($dir =~ /\.hidden/) {
+                   if    ($flavour eq "macosx")  { $self->{value} = ".private_extern\t$prefix$line"; }
+                   elsif ($flavour eq "mingw64") { $self->{value} = ""; }
+               } elsif ($dir =~ /\.comm/) {
+                   $self->{value} = "$dir\t$prefix$line";
                }
                $line = "";
                return $self;
@@ -615,6 +620,19 @@ my %globals;
                                                .join(",",@str) if (@str);
                                    last;
                                  };
+               /\.comm/    && do { my @str=split(/,\s*/,$line);
+                                   my $v=undef;
+                                   if ($nasm) {
+                                       $v.="common     $prefix@str[0] @str[1]:near";
+                                   } else {
+                                       $v="$current_segment\tENDS\n" if ($current_segment);
+                                       $current_segment = ".data";
+                                       $v.="$current_segment\tSEGMENT\n";
+                                       $v.="COMM       @str[0]:DWORD:".@str[1]/4;
+                                   }
+                                   $self->{value} = $v;
+                                   last;
+                                 };
            }
            $line = "";
        }
@@ -629,14 +647,11 @@ my %globals;
 
 sub rex {
  local *opcode=shift;
- my ($dst,$src)=@_;
+ my ($dst,$src,$rex)=@_;
 
-   if ($dst>=8 || $src>=8) {
-       $rex=0x40;
-       $rex|=0x04 if($dst>=8);
-       $rex|=0x01 if($src>=8);
-       push @opcode,$rex;
-   }
+   $rex|=0x04 if($dst>=8);
+   $rex|=0x01 if($src>=8);
+   push @opcode,($rex|0x40) if ($rex);
 }
 
 # older gas and ml64 don't handle SSE>2 instructions
index ba95f0b2298d4f3959d7e5c7e9f8abbe6a43bb3f..40d42135bbc8747891b0794b9ccfe07a47c66652 100644 (file)
@@ -14,9 +14,13 @@ open STDOUT,"| $^X ${dir}perlasm/x86_64-xlate.pl $flavour $output";
 
 print<<___;
 .extern                OPENSSL_cpuid_setup
+.hidden                OPENSSL_cpuid_setup
 .section       .init
        call    OPENSSL_cpuid_setup
 
+.hidden        OPENSSL_ia32cap_P
+.comm  OPENSSL_ia32cap_P,8
+
 .text
 
 .globl OPENSSL_atomic_add