summaryrefslogtreecommitdiff
path: root/cesar/common
diff options
context:
space:
mode:
authorschodet2009-09-21 11:00:02 +0000
committerschodet2009-09-21 11:00:02 +0000
commitd33ce728536444ace9b5f01c289e9715661d7600 (patch)
tree4df5e4bc17ba3ba8d4a99aebef6514015b2a3b63 /cesar/common
parent84bed9b791eb646eb81ab22dd64d827cadd9105b (diff)
* common/make, common/tools:
- automaticaly compute lram size. git-svn-id: svn+ssh://pessac/svn/cesar/trunk@5627 017c9cb6-072f-447c-8318-d5b54f68fe89
Diffstat (limited to 'cesar/common')
-rw-r--r--cesar/common/make/build.mk12
-rw-r--r--cesar/common/make/func.mk5
-rw-r--r--cesar/common/make/setup.mk1
-rw-r--r--cesar/common/make/target.mk1
-rw-r--r--cesar/common/make/test/Config.alt-output1
-rw-r--r--cesar/common/make/test/b_shout.h-output1
-rw-r--r--cesar/common/make/test/clean-output2
-rw-r--r--cesar/common/make/test/first-output1
-rw-r--r--cesar/common/make/test/test_make.c-output1
-rw-r--r--cesar/common/make/test/test_make.h-output1
-rwxr-xr-xcesar/common/tools/lram-size108
11 files changed, 132 insertions, 2 deletions
diff --git a/cesar/common/make/build.mk b/cesar/common/make/build.mk
index 8bc179a8d1..211f84cac6 100644
--- a/cesar/common/make/build.mk
+++ b/cesar/common/make/build.mk
@@ -22,6 +22,7 @@ TARGET_LINK = $(TARGET_CC) $(TARGET_CFLAGS) $(TARGET_LDFLAGS)
TARGET_LINK_CXX = $(TARGET_CXX) $(TARGET_CXXFLAGS) $(TARGET_LDFLAGS)
TARGET_MAKE_BIN = $(TARGET_OBJCOPY) -O binary
TARGET_MAKE_ROM = $(TOOLS_DIR)/bin2rom
+TARGET_MAKE_SIZE = $(TOOLS_DIR)/lram-size
.PHONY: build.all host.all target.all build.clean
@@ -32,6 +33,7 @@ host.all: $(HOST_EXES)
target.all: \
$(if $(MAKE_ROM),$(TARGET_ROMS)) \
$(if $(MAKE_BIN),$(TARGET_BINS)) \
+ $(if $(MAKE_SIZE),$(TARGET_SIZES)) \
$(TARGET_ELFS)
# For each program, define the link rule.
@@ -73,13 +75,21 @@ $(call prog2rom,%): $(call prog2bin,%)
@echo $(MAKE_ROM_rule_template_echo)" [target] $@"
$Q$(TARGET_MAKE_ROM) < $< > $@
+# SIZE file rule.
+MAKE_SIZE_rule_template_echo := "SIZE"
+%.size: $(call prog2size,%)
+$(call prog2size,%): $(call prog2exe,%,target)
+ @echo $(MAKE_SIZE_rule_template_echo)" [target] $@"
+ $Q$(TARGET_MAKE_SIZE) -t $<
+ $Q$(TARGET_MAKE_SIZE) -d $< > $@
+
# Include deps.
-include $(call src2dep,$(HOST_SOURCES),host)
-include $(call src2dep,$(TARGET_SOURCES),target)
# Clean rules.
build.clean:
- rm -f $(HOST_EXES) $(TARGET_ELFS) $(TARGET_BINS) $(TARGET_ROMS) \
+ rm -f $(HOST_EXES) $(TARGET_ELFS) $(TARGET_BINS) $(TARGET_ROMS) $(TARGET_SIZES) \
$(call src2obj,$(HOST_SOURCES),host) \
$(call src2obj,$(TARGET_SOURCES),target) \
$(call src2dep,$(HOST_SOURCES),host) \
diff --git a/cesar/common/make/func.mk b/cesar/common/make/func.mk
index 45addb8c44..6159aab236 100644
--- a/cesar/common/make/func.mk
+++ b/cesar/common/make/func.mk
@@ -55,6 +55,11 @@ prog2bin = $(patsubst %,$(OBJ_DIR)/%.bin,$1)
# => $(OBJ_DIR)/test_foo.rom
prog2rom = $(patsubst %,$(OBJ_DIR)/%.rom,$1)
+# Program name to SIZE file name.
+# $(call prog2size,test_foo)
+# => $(OBJ_DIR)/test_foo.size
+prog2size = $(patsubst %,$(OBJ_DIR)/%.size,$1)
+
# Build type (target or host) to variable name.
# $(call type2var,target)_CC
# => TARGET_CC
diff --git a/cesar/common/make/setup.mk b/cesar/common/make/setup.mk
index e26e7252b0..39d6e1f8b6 100644
--- a/cesar/common/make/setup.mk
+++ b/cesar/common/make/setup.mk
@@ -8,6 +8,7 @@ HOST_EXES := $(call prog2exe,$(HOST_PROGRAMS),host)
TARGET_ELFS := $(call prog2exe,$(TARGET_PROGRAMS),target)
TARGET_BINS := $(call prog2bin,$(TARGET_PROGRAMS))
TARGET_ROMS := $(call prog2rom,$(TARGET_PROGRAMS))
+TARGET_SIZES := $(call prog2size,$(TARGET_PROGRAMS))
ALL_PROGRAMS := $(HOST_PROGRAMS) $(TARGET_PROGRAMS)
ALL_MODULES := $(sort $(foreach program,$(ALL_PROGRAMS),$($(program)_MODULES)))
diff --git a/cesar/common/make/target.mk b/cesar/common/make/target.mk
index e646ff653b..2646badfab 100644
--- a/cesar/common/make/target.mk
+++ b/cesar/common/make/target.mk
@@ -11,6 +11,7 @@ ifeq ($(TARGET),sparc)
CROSS_COMPILE := $(TARGET)-elf-
MAKE_BIN := y
MAKE_ROM := y
+ MAKE_SIZE := y
# Sparc v8.
TARGET_CFLAGS += -mcpu=v8
diff --git a/cesar/common/make/test/Config.alt-output b/cesar/common/make/test/Config.alt-output
index 178021c704..0eb894a064 100644
--- a/cesar/common/make/test/Config.alt-output
+++ b/cesar/common/make/test/Config.alt-output
@@ -8,3 +8,4 @@ MAKE ecos.all
LINK [target] obj/test_make_ecos.elf
BIN [target] obj/test_make_ecos.bin
ROM [target] obj/test_make_ecos.rom
+SIZE [target] obj/test_make_ecos.size
diff --git a/cesar/common/make/test/b_shout.h-output b/cesar/common/make/test/b_shout.h-output
index 8a0a86e93e..0e87e7ed9e 100644
--- a/cesar/common/make/test/b_shout.h-output
+++ b/cesar/common/make/test/b_shout.h-output
@@ -6,3 +6,4 @@ MAKE ecos.all
LINK [target] obj/test_make_ecos.elf
BIN [target] obj/test_make_ecos.bin
ROM [target] obj/test_make_ecos.rom
+SIZE [target] obj/test_make_ecos.size
diff --git a/cesar/common/make/test/clean-output b/cesar/common/make/test/clean-output
index 454ff7a3e4..a639596a7d 100644
--- a/cesar/common/make/test/clean-output
+++ b/cesar/common/make/test/clean-output
@@ -1,7 +1,7 @@
CONF merge
rm -f obj/Config.empty obj/Config.merged obj/Config.list obj/Module.list
rm -rf obj/inc/config.h obj/inc/config obj/inc/module_config.h
-rm -f obj/test_make obj/test_cpp obj/test_make_ecos.elf obj/test_make_ecos.bin obj/test_make_ecos.rom \
+rm -f obj/test_make obj/test_cpp obj/test_make_ecos.elf obj/test_make_ecos.bin obj/test_make_ecos.rom obj/test_make_ecos.size \
rm -rf obj/ecos/tree.stamp obj/ecos/build
rm -rf obj/ecos/headers.stamp obj/ecos/install
rm -f obj/ecos/ecos.ecc obj/ecos/ecos-cov.ecc new-ecos.ecc
diff --git a/cesar/common/make/test/first-output b/cesar/common/make/test/first-output
index 55d88fa47d..145160f052 100644
--- a/cesar/common/make/test/first-output
+++ b/cesar/common/make/test/first-output
@@ -24,3 +24,4 @@ MAKE ecos.all
LINK [target] obj/test_make_ecos.elf
BIN [target] obj/test_make_ecos.bin
ROM [target] obj/test_make_ecos.rom
+SIZE [target] obj/test_make_ecos.size
diff --git a/cesar/common/make/test/test_make.c-output b/cesar/common/make/test/test_make.c-output
index 80323bbcc5..201f14ab9c 100644
--- a/cesar/common/make/test/test_make.c-output
+++ b/cesar/common/make/test/test_make.c-output
@@ -5,3 +5,4 @@ MAKE ecos.all
LINK [target] obj/test_make_ecos.elf
BIN [target] obj/test_make_ecos.bin
ROM [target] obj/test_make_ecos.rom
+SIZE [target] obj/test_make_ecos.size
diff --git a/cesar/common/make/test/test_make.h-output b/cesar/common/make/test/test_make.h-output
index 75d4cccd3c..d19c2cf4f0 100644
--- a/cesar/common/make/test/test_make.h-output
+++ b/cesar/common/make/test/test_make.h-output
@@ -7,3 +7,4 @@ MAKE ecos.all
LINK [target] obj/test_make_ecos.elf
BIN [target] obj/test_make_ecos.bin
ROM [target] obj/test_make_ecos.rom
+SIZE [target] obj/test_make_ecos.size
diff --git a/cesar/common/tools/lram-size b/cesar/common/tools/lram-size
new file mode 100755
index 0000000000..d1edaaff89
--- /dev/null
+++ b/cesar/common/tools/lram-size
@@ -0,0 +1,108 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use Getopt::Long qw(:config no_ignore_case bundling);
+use Pod::Usage;
+
+# Option parsing.
+my $help;
+my $details;
+my $total;
+my $prefix = 'sparc-elf-';
+my @rams;
+GetOptions (
+ 'help|h' => \$help,
+ 'details|d' => \$details,
+ 'total|t' => \$total,
+ 'prefix|p=s' => \$prefix,
+ 'ram|r=s' => \@rams,
+) or pod2usage (2);
+pod2usage (1) if $help;
+@ARGV == 1 or pod2usage (2);
+$details or $total or pod2usage (2);
+@rams = qw(ilram dlram_data dlram_bss) unless @rams;
+
+my $file = shift @ARGV;
+
+if ($details)
+{
+ # Memories hashes.
+ my %rams;
+ $rams{$_} = { } for @rams;
+
+ # Eat file into memory.
+ open F, "${prefix}objdump -t $file|"
+ or die "can not read symbols: $!, stopping";
+ while (<F>)
+ {
+ if (/^[[:xdigit:]]{8} .{7} \.(\S+)\t([[:xdigit:]]{8}) ([^.].*)/)
+ {
+ my ($ram, $size, $name) = ($1, hex ($2), $3);
+ next unless exists $rams{$ram};
+ exists $rams{$ram}->{$name} and die;
+ $rams{$ram}->{$name} = $size;
+ }
+ }
+ close F;
+
+ # Dump.
+ for my $ram (@rams)
+ {
+ my $size = 0;
+ my $d = $rams{$ram};
+ print "$ram:\n";
+ my @okeys = sort { $d->{$b} <=> $d->{$a} } keys %$d;
+ for (@okeys)
+ {
+ printf "%8d $_\n", $d->{$_};
+ $size += $d->{$_};
+ }
+ #printf "%8d total\n", $size
+ }
+}
+
+if ($total)
+{
+ # Memories hash.
+ my %rams;
+ $rams{$_} = 0 for @rams;
+
+ # Eat file into memory.
+ open F, "${prefix}size -A $file|"
+ or die "can not read size: $!, stopping";
+ while (<F>)
+ {
+ if (/^\.(\S+)\s*(\d+)/)
+ {
+ my ($ram, $size) = ($1, $2);
+ next unless exists $rams{$ram};
+ $rams{$ram} != 0 and die;
+ $rams{$ram} = $size;
+ }
+ }
+ close F;
+
+ # Dump.
+ my @o = map { "$_: " . $rams{$_} } @rams;
+ print join (', ', @o), "\n";
+}
+
+__END__
+
+=head1 NAME
+
+lram-size - print local ram usage.
+
+=head1 SYNOPSIS
+
+lram-size [options] file.elf
+
+ Options:
+ -h, --help brief help message
+ -d, --details print detailed section usage
+ -t, --total print total section size
+ -p, --prefix=PREFIX compiler prefix
+ -r, --ram=RAM include specified RAM
+
+=cut
+