[U-Boot] [RFC] kbuild.h: workaround for llvm IAS

KBuild (ab)uses the asm statement to write to a file and llvm integrated as chokes about these invalid asm statements. Workaround it by making it look like valid asm code.
Signed-off-by: Jeroen Hofstee jeroen@myspectrum.nl --- Kbuild | 3 ++- include/linux/kbuild.h | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-)
Does someone have a better solution? Is this valid for all archs?
diff --git a/Kbuild b/Kbuild index 6e1698c..ef97787 100644 --- a/Kbuild +++ b/Kbuild @@ -53,7 +53,8 @@ targets += arch/$(ARCH)/lib/asm-offsets.s
# Default sed regexp - multiline due to syntax constraints define sed-y - "/^->/{s:->#(.*):/* \1 */:; \ + "s:[[:space:]]*.ascii[[:space:]]*"(.*)":\1:; \ + /^->/{s:->#(.*):/* \1 */:; \ s:^->([^ ]*) [$$#]*([-0-9]*) (.*):#define \1 \2 /* \3 */:; \ s:^->([^ ]*) [$$#]*([^ ]*) (.*):#define \1 \2 /* \3 */:; \ s:->::; p;}" diff --git a/include/linux/kbuild.h b/include/linux/kbuild.h index ab7805a..8a9f645 100644 --- a/include/linux/kbuild.h +++ b/include/linux/kbuild.h @@ -7,14 +7,14 @@ #define __LINUX_KBUILD_H
#define DEFINE(sym, val) \ - asm volatile("\n->" #sym " %0 " #val : : "i" (val)) + asm volatile("\n.ascii "->" #sym " %0 " #val """ : : "i" (val))
-#define BLANK() asm volatile("\n->" : : ) +#define BLANK() asm volatile("\n.ascii "->"" : : )
#define OFFSET(sym, str, mem) \ DEFINE(sym, offsetof(struct str, mem))
#define COMMENT(x) \ - asm volatile("\n->#" x) + asm volatile("\n.ascii "->#" x """)
#endif

Hi Jeroen,
On Thu, 12 Jun 2014 23:40:54 +0200 Jeroen Hofstee jeroen@myspectrum.nl wrote:
KBuild (ab)uses the asm statement to write to a file and llvm integrated as chokes about these invalid asm statements. Workaround it by making it look like valid asm code.
Signed-off-by: Jeroen Hofstee jeroen@myspectrum.nl
I think Linux has the same problem.
Are you willing to this patch to linux-kbuild ML? Or fixing U-Boot only?
Best Regards Masahiro Yamada

Hi Masahiro,
On 24-06-14 14:53, Masahiro Yamada wrote:
On Thu, 12 Jun 2014 23:40:54 +0200 Jeroen Hofstee jeroen@myspectrum.nl wrote:
KBuild (ab)uses the asm statement to write to a file and llvm integrated as chokes about these invalid asm statements. Workaround it by making it look like valid asm code.
Signed-off-by: Jeroen Hofstee jeroen@myspectrum.nl
I think Linux has the same problem.
Are you willing to this patch to linux-kbuild ML? Or fixing U-Boot only?
I don't mind in general, but it is just noise for them (cc-ing them to create some). For u-boot (ARM) you actually get a valid binary with this patch after clang support has landed, for linux you just get other errors as far as I tried (native only), patch below.
However in linux there seem more spots relying on the format, e.g. arch/ia64/kvm/Makefile arch/ia64/kernel/Makefile arch/um/Makefile
So if anything, I think this should be made a general rules first in the makefiles. It seems stupid to potentially break something while it gains nothing.
So yes, u-boot only afaic, or does that make your syncing more difficult?
Regards, Jeroen
--- a/Kbuild +++ b/Kbuild @@ -52,7 +52,8 @@ targets += arch/$(SRCARCH)/kernel/asm-offsets.s
# Default sed regexp - multiline due to syntax constraints define sed-y - "/^->/{s:->#(.*):/* \1 */:; \ + "s:[[:space:]]*.ascii[[:space:]]*"(.*)":\1:; \ + /^->/{s:->#(.*):/* \1 */:; \ s:^->([^ ]*) [$$#]*([-0-9]*) (.*):#define \1 \2 /* \3 */:; \ s:^->([^ ]*) [$$#]*([^ ]*) (.*):#define \1 \2 /* \3 */:; \ s:->::; p;}" diff --git a/include/linux/kbuild.h b/include/linux/kbuild.h index 22a7219..4e80f3a 100644 --- a/include/linux/kbuild.h +++ b/include/linux/kbuild.h @@ -2,14 +2,14 @@ #define __LINUX_KBUILD_H
#define DEFINE(sym, val) \ - asm volatile("\n->" #sym " %0 " #val : : "i" (val)) + asm volatile("\n.ascii "->" #sym " %0 " #val """ : : "i" (val))
-#define BLANK() asm volatile("\n->" : : ) +#define BLANK() asm volatile("\n.ascii "->"" : : )
#define OFFSET(sym, str, mem) \ DEFINE(sym, offsetof(struct str, mem))
#define COMMENT(x) \ - asm volatile("\n->#" x) + asm volatile("\n.ascii "->#" x """)
#endif diff --git a/scripts/mod/Makefile b/scripts/mod/Makefile index c11212f..0698af3 100644 --- a/scripts/mod/Makefile +++ b/scripts/mod/Makefile @@ -6,7 +6,8 @@ modpost-objs := modpost.o file2alias.o sumversion.o devicetable-offsets-file := devicetable-offsets.h
define sed-y - "/^->/{s:->#(.*):/* \1 */:; \ + "s:[[:space:]]*.ascii[[:space:]]*"(.*)":\1:; \ + /^->/{s:->#(.*):/* \1 */:; \ s:^->([^ ]*) [$$#]*([-0-9]*) (.*):#define \1 \2 /* \3 */:; \ s:^->([^ ]*) [$$#]*([^ ]*) (.*):#define \1 \2 /* \3 */:; \ s:->::; p;}"

Hi Jeroen,
On Tue, 24 Jun 2014 21:36:06 +0200 Jeroen Hofstee jeroen@myspectrum.nl wrote:
KBuild (ab)uses the asm statement to write to a file and llvm integrated as chokes about these invalid asm statements. Workaround it by making it look like valid asm code.
Signed-off-by: Jeroen Hofstee jeroen@myspectrum.nl
I think Linux has the same problem.
Are you willing to this patch to linux-kbuild ML? Or fixing U-Boot only?
I don't mind in general, but it is just noise for them (cc-ing them to create some). For u-boot (ARM) you actually get a valid binary with this patch after clang support has landed, for linux you just get other errors as far as I tried (native only), patch below.
However in linux there seem more spots relying on the format, e.g. arch/ia64/kvm/Makefile arch/ia64/kernel/Makefile arch/um/Makefile
So if anything, I think this should be made a general rules first in the makefiles. It seems stupid to potentially break something while it gains nothing.
So yes, u-boot only afaic, or does that make your syncing more difficult?
I don't think syncing would be difficult.
BTW, do you know how they resolve this build error in other projects, for example, in llvmlinux ? http://llvm.linuxfoundation.org/index.php/Main_Page
Linux folks merged Clang support into the top Makefile, but not into ./Kbuild. I don't know why.
Best Regards Masahiro Yamada

Hello Masahiro,
On 27-06-14 08:38, Masahiro Yamada wrote:
KBuild (ab)uses the asm statement to write to a file and llvm integrated as chokes about these invalid asm statements. Workaround it by making it look like valid asm code.
Signed-off-by: Jeroen Hofstee jeroen@myspectrum.nl
I think Linux has the same problem.
Are you willing to this patch to linux-kbuild ML? Or fixing U-Boot only?
I don't mind in general, but it is just noise for them (cc-ing them to create some). For u-boot (ARM) you actually get a valid binary with this patch after clang support has landed, for linux you just get other errors as far as I tried (native only), patch below.
However in linux there seem more spots relying on the format, e.g. arch/ia64/kvm/Makefile arch/ia64/kernel/Makefile arch/um/Makefile
So if anything, I think this should be made a general rules first in the makefiles. It seems stupid to potentially break something while it gains nothing.
So yes, u-boot only afaic, or does that make your syncing more difficult?
I don't think syncing would be difficult.
BTW, do you know how they resolve this build error in other projects, for example, in llvmlinux ? http://llvm.linuxfoundation.org/index.php/Main_Page
Linux folks merged Clang support into the top Makefile, but not into ./Kbuild. I don't know why.
I don't know how the llvmlinux people do it, but the alternative is to add -no-integrated-as for clang when compiling such files (or use an older clang version, since that used to be the default). Since gcc's LTO dislikes the asm-offset.c technique as well, I think it is better to actually create valid asm, so it no longer depends on compiler features at all. I will leave it up to the llvmlinux folks to come up with a solution for linux though...
Regards, Jeroen
participants (2)
-
Jeroen Hofstee
-
Masahiro Yamada