Add a new *obj- category, arch-obj. arch-obj-y will be a subset of the
existing obj-y. The difference, is arch-obj components are usable by
multi-arch builds. That is, following the single-arch target builds, the
already-built arch_obj components for multiple targets can be linked
together to form a multi-arch build that supports multi CPU archs.

Such a link is likely to have high numbers of namespace collisions. So
if the target arch supports multi-arch build (CONFIG_ARCH_MULTI),
localise all symbols to a single pre-linked object. The object does
not need to export any APIs, as all APIs are made available via QOM CPU
hooks.

This forms a prerequisite for multi-arch support that there is no
definitions of symbols by arch-obj for use by core code.

For archs converted to multi, target-foo will be arch-obj. But
some CPUs may still need to export APIs to device land (hw/). An
example of this is the ARM co-processor register interface. Such fns
can be split off to new C files in target-foo/hw dir where they remain
obj-y for global visibility. This creates a clearer separation of which
functions are system global and which are private to the CPU.

Signed-off-by: Peter Crosthwaite <crosthwaite.pe...@gmail.com>
---
 Makefile.target | 21 +++++++++++++++++----
 configure       |  6 ++++++
 2 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/Makefile.target b/Makefile.target
index ec5b92c..c20ca06 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -84,12 +84,16 @@ all: $(PROGS) stap
 
 #########################################################
 # cpu emulator library
-obj-y = exec.o translate-all.o cpu-exec.o
-obj-y += tcg/tcg.o tcg/tcg-op.o tcg/optimize.o
+obj-y += exec.o
+arch-obj-$(call lnot,$(TARGET_MULTI)) += translate-all.o
+arch-obj-$(call lnot,$(TARGET_MULTI)) += cpu-exec.o
+arch-obj-$(call lnot,$(TARGET_MULTI)) += tcg/tcg.o tcg/tcg-op.o tcg/optimize.o
 obj-$(CONFIG_TCG_INTERPRETER) += tci.o
 obj-$(CONFIG_TCG_INTERPRETER) += disas/tci.o
 obj-y += fpu/softfloat.o
-obj-y += target-$(TARGET_BASE_ARCH)/
+obj-$(CONFIG_ARCH_SINGLE) += target-$(TARGET_BASE_ARCH)/
+arch-obj-$(CONFIG_ARCH_MULTI) += target-$(TARGET_BASE_ARCH)/
+obj-$(CONFIG_ARCH_MULTI) += target-$(TARGET_BASE_ARCH)/hw/
 obj-y += disas.o
 obj-$(call notempty,$(TARGET_XML_FILES)) += gdbstub-xml.o
 obj-$(call lnot,$(CONFIG_KVM)) += kvm-stub.o
@@ -132,7 +136,8 @@ obj-y += arch_init.o cpus.o monitor.o gdbstub.o balloon.o 
ioport.o numa.o
 obj-y += qtest.o bootdevice.o
 obj-y += hw/
 obj-$(CONFIG_KVM) += kvm-all.o
-obj-y += memory.o savevm.o cputlb.o
+obj-y += memory.o savevm.o
+arch-obj-$(call lnot,$(TARGET_MULTI)) += cputlb.o
 obj-y += memory_mapping.o
 obj-y += dump.o
 LIBS := $(libs_softmmu) $(LIBS)
@@ -158,6 +163,12 @@ endif # CONFIG_SOFTMMU
 %/translate.o: QEMU_CFLAGS += $(TRANSLATE_OPT_CFLAGS)
 
 dummy := $(call unnest-vars,,obj-y)
+dummy := $(call unnest-vars,,arch-obj-y)
+
+arch-obj.o: $(arch-obj-y)
+       $(call quiet-command,$(LD) $(filter-out %.mak, $^) -r -o $@,"LINK $@")
+       $(call quiet-command,$(OBJCOPY) -w -L "*" $@,"OBJCOPY $@")
+
 all-obj-y := $(obj-y)
 
 target-obj-y :=
@@ -174,6 +185,8 @@ dummy := $(call unnest-vars,.., \
 target-obj-y := $(target-obj-y-save)
 all-obj-y += $(common-obj-y)
 all-obj-y += $(target-obj-y)
+all-obj-$(CONFIG_ARCH_SINGLE) += $(arch-obj-y)
+all-obj-$(CONFIG_ARCH_MULTI) += arch-obj.o
 all-obj-$(CONFIG_SOFTMMU) += $(block-obj-y)
 
 $(QEMU_PROG_BUILD): config-devices.mak
diff --git a/configure b/configure
index 3145dd6..1acafcd 100755
--- a/configure
+++ b/configure
@@ -5480,6 +5480,12 @@ if test "$tcg_interpreter" = "yes" ; then
   echo "CONFIG_TCI_DIS=y"  >> config-all-disas.mak
 fi
 
+case "$TARGET_BASE_ARCH" in
+*)
+  echo "CONFIG_ARCH_SINGLE=y"  >> $config_target_mak
+;;
+esac
+
 case "$ARCH" in
 alpha)
   # Ensure there's only a single GP
-- 
1.9.1


Reply via email to