Skip to content

Commit

Permalink
x86/mm: avoid building multiple .o from a single .c file
Browse files Browse the repository at this point in the history
This replace the use of a single .c file use for multiple .o file by
creating multiple .c file including the first one.

There's quite a few issues with trying to build more than one object
file from a single source file: there's is a duplication of the make
rules to generate those targets; there is an additional ".file" symbol
added in order to differentiate between the object files; and the
tools/symbols have an heuristic to try to pick up the right ".file".

This patch adds new .c source file which avoid the need to add a
second ".file" symbol and thus avoid the need to deal with those
issues.

Also remove __OBJECT_FILE__ from $(CC) command line as it isn't used
anywhere anymore. And remove the macro "build-intermediate" since the
generic rules for single targets can be used.

And rename the objects in mm/hap/ to remove the extra "level".

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
  • Loading branch information
anthonyper-ctx authored and jbeulich committed Oct 12, 2021
1 parent e26f810 commit 71cf763
Show file tree
Hide file tree
Showing 18 changed files with 24 additions and 67 deletions.
11 changes: 0 additions & 11 deletions xen/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -518,17 +518,6 @@ _MAP:
%/: FORCE
$(MAKE) -f $(BASEDIR)/Rules.mk -C $* built_in.o built_in_bin.o

build-intermediate = $(eval $(call build-intermediate-closure,$(1)))
define build-intermediate-closure
$(1): FORCE
$(MAKE) -f $(BASEDIR)/Rules.mk -C $$(@D) $$(@F)
endef

$(foreach base,arch/x86/mm/guest_walk_% \
arch/x86/mm/hap/guest_walk_%level \
arch/x86/mm/shadow/guest_%, \
$(foreach ext,o i s,$(call build-intermediate,$(base).$(ext))))

.PHONY: cloc
cloc:
$(eval tmpfile := $(shell mktemp))
Expand Down
2 changes: 1 addition & 1 deletion xen/Rules.mk
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ cpp_flags = $(filter-out -Wa$(comma)% -flto,$(1))
# Calculation of flags, first the generic flags, then the arch specific flags,
# and last the flags modified for a target or a directory.

c_flags = -MMD -MP -MF $(@D)/.$(@F).d $(XEN_CFLAGS) '-D__OBJECT_FILE__="$@"'
c_flags = -MMD -MP -MF $(@D)/.$(@F).d $(XEN_CFLAGS)
a_flags = -MMD -MP -MF $(@D)/.$(@F).d $(XEN_AFLAGS)

include $(BASEDIR)/arch/$(TARGET_ARCH)/Rules.mk
Expand Down
9 changes: 0 additions & 9 deletions xen/arch/x86/mm/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,3 @@ obj-$(CONFIG_MEM_SHARING) += mem_sharing.o
obj-y += p2m.o
obj-$(CONFIG_HVM) += p2m-ept.o p2m-pod.o p2m-pt.o
obj-y += paging.o

guest_walk_%.o: guest_walk.c Makefile
$(CC) $(c_flags) -DGUEST_PAGING_LEVELS=$* -c $< -o $@

guest_walk_%.i: guest_walk.c Makefile
$(CPP) $(call cpp_flags,$(c_flags)) -DGUEST_PAGING_LEVELS=$* -c $< -o $@

guest_walk_%.s: guest_walk.c Makefile
$(CC) $(filter-out -Wa$(comma)%,$(c_flags)) -DGUEST_PAGING_LEVELS=$* -S $< -o $@
3 changes: 0 additions & 3 deletions xen/arch/x86/mm/guest_walk.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,6 @@
* along with this program; If not, see <http://www.gnu.org/licenses/>.
*/

/* Allow uniquely identifying static symbols in the 3 generated objects. */
asm(".file \"" __OBJECT_FILE__ "\"");

#include <xen/types.h>
#include <xen/mm.h>
#include <xen/paging.h>
Expand Down
2 changes: 2 additions & 0 deletions xen/arch/x86/mm/guest_walk_2.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#define GUEST_PAGING_LEVELS 2
#include "guest_walk.c"
2 changes: 2 additions & 0 deletions xen/arch/x86/mm/guest_walk_3.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#define GUEST_PAGING_LEVELS 3
#include "guest_walk.c"
2 changes: 2 additions & 0 deletions xen/arch/x86/mm/guest_walk_4.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#define GUEST_PAGING_LEVELS 4
#include "guest_walk.c"
15 changes: 3 additions & 12 deletions xen/arch/x86/mm/hap/Makefile
Original file line number Diff line number Diff line change
@@ -1,15 +1,6 @@
obj-y += hap.o
obj-y += guest_walk_2level.o
obj-y += guest_walk_3level.o
obj-y += guest_walk_4level.o
obj-y += guest_walk_2.o
obj-y += guest_walk_3.o
obj-y += guest_walk_4.o
obj-y += nested_hap.o
obj-y += nested_ept.o

guest_walk_%level.o: guest_walk.c Makefile
$(CC) $(c_flags) -DGUEST_PAGING_LEVELS=$* -c $< -o $@

guest_walk_%level.i: guest_walk.c Makefile
$(CPP) $(call cpp_flags,$(c_flags)) -DGUEST_PAGING_LEVELS=$* -c $< -o $@

guest_walk_%level.s: guest_walk.c Makefile
$(CC) $(filter-out -Wa$(comma)%,$(c_flags)) -DGUEST_PAGING_LEVELS=$* -S $< -o $@
3 changes: 0 additions & 3 deletions xen/arch/x86/mm/hap/guest_walk.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,6 @@
* this program; If not, see <http://www.gnu.org/licenses/>.
*/

/* Allow uniquely identifying static symbols in the 3 generated objects. */
asm(".file \"" __OBJECT_FILE__ "\"");

#include <xen/domain_page.h>
#include <xen/paging.h>
#include <xen/sched.h>
Expand Down
2 changes: 2 additions & 0 deletions xen/arch/x86/mm/hap/guest_walk_2.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#define GUEST_PAGING_LEVELS 2
#include "guest_walk.c"
2 changes: 2 additions & 0 deletions xen/arch/x86/mm/hap/guest_walk_3.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#define GUEST_PAGING_LEVELS 3
#include "guest_walk.c"
2 changes: 2 additions & 0 deletions xen/arch/x86/mm/hap/guest_walk_4.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#define GUEST_PAGING_LEVELS 4
#include "guest_walk.c"
9 changes: 0 additions & 9 deletions xen/arch/x86/mm/shadow/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,3 @@ obj-$(CONFIG_PV) += pv.o guest_4.o
else
obj-y += none.o
endif

guest_%.o: multi.c Makefile
$(CC) $(c_flags) -DGUEST_PAGING_LEVELS=$* -c $< -o $@

guest_%.i: multi.c Makefile
$(CPP) $(call cpp_flags,$(c_flags)) -DGUEST_PAGING_LEVELS=$* -c $< -o $@

guest_%.s: multi.c Makefile
$(CC) $(filter-out -Wa$(comma)%,$(c_flags)) -DGUEST_PAGING_LEVELS=$* -S $< -o $@
2 changes: 2 additions & 0 deletions xen/arch/x86/mm/shadow/guest_2.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#define GUEST_PAGING_LEVELS 2
#include "multi.c"
2 changes: 2 additions & 0 deletions xen/arch/x86/mm/shadow/guest_3.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#define GUEST_PAGING_LEVELS 3
#include "multi.c"
2 changes: 2 additions & 0 deletions xen/arch/x86/mm/shadow/guest_4.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#define GUEST_PAGING_LEVELS 4
#include "multi.c"
3 changes: 0 additions & 3 deletions xen/arch/x86/mm/shadow/multi.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,6 @@
* along with this program; If not, see <http://www.gnu.org/licenses/>.
*/

/* Allow uniquely identifying static symbols in the 3 generated objects. */
asm(".file \"" __OBJECT_FILE__ "\"");

#include <xen/types.h>
#include <xen/mm.h>
#include <xen/trace.h>
Expand Down
18 changes: 2 additions & 16 deletions xen/tools/symbols.c
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,6 @@ static int read_symbol(FILE *in, struct sym_entry *s)
{
char str[500], type[20] = "";
char *sym, stype;
static enum { symbol, single_source, multi_source } last;
static char *filename;
int rc = -1;

Expand Down Expand Up @@ -118,24 +117,11 @@ static int read_symbol(FILE *in, struct sym_entry *s)
*/
input_format == fmt_sysv && !*type && stype == '?' && sym &&
sym[1] && strchr("cSsoh", sym[1]) && !sym[2])) {
/*
* gas prior to binutils commit fbdf9406b0 (expected to appear
* in 2.27) outputs symbol table entries resulting from .file
* in reverse order. If we get two consecutive file symbols,
* prefer the first one if that names an object file or has a
* directory component (to cover multiply compiled files).
*/
bool multi = strchr(str, '/') || (sym && sym[1] == 'o');

if (multi || last != multi_source) {
free(filename);
filename = *str ? strdup(str) : NULL;
}
last = multi ? multi_source : single_source;
free(filename);
filename = *str ? strdup(str) : NULL;
goto skip_tail;
}

last = symbol;
rc = -1;

sym = str;
Expand Down

0 comments on commit 71cf763

Please sign in to comment.