CFLAGS += -I$(BASEDIR)/include
CFLAGS += -I$(BASEDIR)/include/asm-x86/mach-generic
CFLAGS += -I$(BASEDIR)/include/asm-x86/mach-default
+CFLAGS += '-D__OBJECT_LABEL__=$(subst /,$$,$(subst -,_,$(subst $(BASEDIR)/,,$(CURDIR))/$@))'
# Prevent floating-point variables from creeping into Xen.
CFLAGS += -msoft-float
$(call as-insn-check,CFLAGS,CC,"vmcall",-DHAVE_GAS_VMX)
$(call as-insn-check,CFLAGS,CC,"invept (%rax)$$(comma)%rax",-DHAVE_GAS_EPT)
$(call as-insn-check,CFLAGS,CC,"rdfsbase %rax",-DHAVE_GAS_FSGSBASE)
+$(call as-insn-check,CFLAGS,CC,".equ \"x\"$$(comma)1", \
+ -U__OBJECT_LABEL__ -DHAVE_GAS_QUOTED_SYM \
+ '-D__OBJECT_LABEL__=$(subst $(BASEDIR)/,,$(CURDIR))/$$@')
x86 := y
x86_32 := n
#ifdef __ASSEMBLY__
+#ifdef HAVE_GAS_QUOTED_SYM
+#define SUBSECTION_LBL(tag) \
+ .ifndef .L.tag; \
+ .equ .L.tag, 1; \
+ .equ __stringify(__OBJECT_LABEL__.tag), .; \
+ .endif
+#else
+#define SUBSECTION_LBL(tag) \
+ .ifndef __OBJECT_LABEL__.tag; \
+ __OBJECT_LABEL__.tag:; \
+ .endif
+#endif
+
#define UNLIKELY_START(cond, tag) \
.Ldispatch.tag: \
j##cond .Lunlikely.tag; \
.subsection 1; \
+ SUBSECTION_LBL(unlikely); \
.Lunlikely.tag:
#define UNLIKELY_DISPATCH_LABEL(tag) \
#else
+#ifdef HAVE_GAS_QUOTED_SYM
+#define SUBSECTION_LBL(tag) \
+ ".ifndef .L." #tag "\n\t" \
+ ".equ .L." #tag ", 1\n\t" \
+ ".equ \"" __stringify(__OBJECT_LABEL__) "." #tag "\", .\n\t" \
+ ".endif"
+#else
+#define SUBSECTION_LBL(tag) \
+ ".ifndef " __stringify(__OBJECT_LABEL__) "." #tag "\n\t" \
+ __stringify(__OBJECT_LABEL__) "." #tag ":\n\t" \
+ ".endif"
+#endif
+
#ifdef __clang__ /* clang's builtin assember can't do .subsection */
-#define UNLIKELY_START_SECTION ".pushsection .fixup,\"ax\""
+#define UNLIKELY_START_SECTION ".pushsection .text.unlikely,\"ax\""
#define UNLIKELY_END_SECTION ".popsection"
#else
#define UNLIKELY_START(cond, tag) \
"j" #cond " .Lunlikely%=.tag;\n\t" \
- UNLIKELY_START_SECTION "\n" \
+ UNLIKELY_START_SECTION "\n\t" \
+ SUBSECTION_LBL(unlikely) "\n" \
".Lunlikely%=.tag:"
#define UNLIKELY_END(tag) \