# ========== Copyright Header Begin ==========================================
# OpenSPARC T2 Processor File: Segment.pm
# Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved
# 4150 Network Circle, Santa Clara, California 95054, U.S.A.
# * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
# 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; version 2 of the License.
# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# For the avoidance of doubt, and except that if any non-GPL license
# choice is available it will apply instead, Sun elects to use only
# the General Public License version 2 (GPLv2) at this time for any
# software where a choice of GPL license versions is made
# available with the language indicating that GPLv2 or any later version
# may be used, or where a choice of which version of the GPL is applied is
# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
# CA 95054 USA or visit www.sun.com if you need additional information or
# ========== Copyright Header End ============================================
our @EXPORT = qw(SEG_UNDEF SEG_TEXT SEG_DATA SEG_BSS);
include_elf
=> [qw(.rodata)],
elfname_out
=> '.text .rodata',
our %RevNames = map { ( $Segments{$_}{name
}, $_) } keys %Segments;
{ defined $Segments{$_}{elfname
} ?
( $Segments{$_}{elfname
}, $Segments{$_}{name
} ) : () } keys %Segments;
foreach my $code (keys %Segments) {
next unless exists $Segments{$code}{include_elf
};
foreach my $included (@
{$Segments{$code}{include_elf
}}) {
$ElfNames{$included} = $Segments{$code}{name
};
{ ( $Segments{$_}{link_suffix
}, $Segments{$_}{name
} ) } keys %Segments;
# rodata must appear before text or the linker will merge them
#our @Names = qw(rodata text data bss);
our @Names = qw(text data bss);
my @keys = keys %Segments;
fatal
"In Midas::Segment, @Names is incomplete.\n", M_CODE
;
} elsif(@Names > @keys) {
fatal
"In Midas::Segment, @Names has extra entry\n", M_CODE
;
foreach my $name (@Names) {
fatal
"Segment name '$name' is not set up correctly in Midas::Segment\n",
M_CODE
unless exists $RevNames{$name};
###############################################################################
$type = $class->name2type($type) if $type =~ /[a-zA-Z]/;
my $classtype = ref $class;
$this = fields
::new
($classtype);
$this->{type
} = $class->type() if defined $class->type();
$this = fields
::new
($class);
$this->{type
} = $type if defined $type;
###############################################################################
fatal Carp
::longmess
("No such segment type '$set'.\n"), M_CODE
unless exists $Segments{$set}{name
};
###############################################################################
$this->type($this->name2type($set));
return $this->type2name($this->{type
});
###############################################################################
###############################################################################
return 1 if exists $RevNames{$name};
###############################################################################
fatal Carp
::longmess
("No such segment name '$name'.\n"), M_CODE
unless exists $RevNames{$name};
###############################################################################
fatal Carp
::longmess
("No such segment name '$name'.\n"), M_CODE
unless exists $RevNames{$name};
return $Segments{$RevNames{$name}}{va_name
};
###############################################################################
fatal Carp
::longmess
("No such segment name '$name'.\n"), M_CODE
unless exists $RevNames{$name};
return exists $Segments{$RevNames{$name}}{elfname_out
} ?
$Segments{$RevNames{$name}}{elfname_out
} :
$Segments{$RevNames{$name}}{elfname
};
###############################################################################
fatal Carp
::longmess
("No such segment name '$name'.\n"), M_CODE
unless exists $RevNames{$name};
return $Segments{$RevNames{$name}}{link_suffix
};
###############################################################################
fatal Carp
::longmess
("No such segment type '$type'.\n"), M_CODE
unless exists $Segments{$type}{name
};
return $Segments{$type}{name
};
###############################################################################
###############################################################################
return map { $Segments{$_}{va_name
} } keys %Segments;
###############################################################################
###############################################################################