c
1 #define DEFINE(sym, val) \ 2 asm volatile("\n->" #sym " %0 " #val : : "i" (val))
上記のインラインアセンブリは一体なんですか?
①"\n->" #sym " %0 " #val
②: : "i" (val)
「1」
関連ありそう質問
コメントを見ると
"\n->" #sym " %0 " #val
上記自体が1つの文字列として要約されると書かれています。
リンク内容
"\n->" #sym " %0 " #val
↓
"\n->""sym" "%0" "val"
だと思っていましたがやっぱ違いますよね?
「2」
関連ありそうな内容のリンクを貼りました。
すべて拝見しましたがよくわかりませんでした・・・。
: : "i" (val)
は
:"=i"(val)
:"i"(val)
にでもなるのかなと思っていましたが
PTXがなんちゃらとか書かれているので
やっぱ違うのでしょうか?
検索にかけて調べていたのですが結局成果は1つもなしで分からずじ終いに終わりました。
分からないので教えてください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/12 08:37
2020/04/12 08:52
2020/04/12 09:08
2020/04/12 09:18
2020/04/12 09:21
2020/04/12 09:25
回答2件
0
ベストアンサー
Kbuildとセットで読む必要があります。
というのも、asm-offsets.c
は通常の.cファイルと目的が違い
最終的に作りたいのはasm-offsets.h
なのです。
そのために、インラインアセンブラの.s
生成機能を文書生成機として用い
sed
によって置換を行っています。
c
1DEFINE(TI_TASK, offsetof(struct thread_info, task)); 2DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
↓
s
1-> TI_TASK $0 offsetof(struct thread_info, task) 2-> TI_FLAGS $16 offsetof(struct thread_info, flags)
↓
c
1#define TI_TASK 0 /* offsetof(struct thread_info, task) */ 2#define TI_FLAGS 16 /* offsetof(struct thread_info, flags) */
投稿2020/04/11 22:59
編集2020/04/15 10:31総合スコア15149
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/12 08:47
2020/04/12 09:06
2020/04/12 09:15
2020/04/12 10:02
2020/04/12 10:37
2020/04/12 11:47
2020/04/12 13:10
2020/04/12 14:22
2020/04/13 02:27
2020/04/13 02:46
2020/04/13 02:57
2020/04/13 05:01
2020/04/13 06:59 編集
2020/04/13 09:52
2020/04/15 03:22
2020/04/15 04:06
2020/04/15 07:00
2020/04/15 08:26
2020/04/15 09:22
2020/04/15 10:06
2020/04/15 10:39 編集
2020/04/15 16:28
0
c
1// gen.c 2#define DEFINE(sym, val) \ 3 asm volatile("\n->" #sym " %0 " #val : : "i" (val)) 4 5#define BLANK() asm volatile("\n->" : : ) 6 7void foo(void) 8{ 9 DEFINE(SIZE_PTR, sizeof(void*)); 10}
gcc -fverbose-asm -S gen.c -o gen.s
結果
asm
1 .file "gen.c" 2 # GNU C17 (GCC) version 9.1.0 (x86_64-pc-msys) 3 # compiled by GNU C version 9.1.0, GMP version 6.1.2, MPFR version 4.0.2, MPC version 1.1.0, isl version isl-0.21-GMP 4 5 # warning: GMP header version 6.1.2 differs from library version 6.2.0. 6 # GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 7 # 渡されたオプション: 8 # -idirafter /usr/lib/gcc/x86_64-pc-msys/9.1.0/../../../../lib/../include/w32api 9 # -idirafter /usr/lib/gcc/x86_64-pc-msys/9.1.0/../../../../x86_64-pc-msys/lib/../lib/../../include/w32api 10 # gen.c -mtune=generic -march=x86-64 -auxbase-strip gen.s -fverbose-asm 11 # 有効オプション: -faggressive-loop-optimizations -fassume-phsa 12 # -fasynchronous-unwind-tables -fauto-inc-dec -fcommon 13 # -fdelete-null-pointer-checks -fdwarf2-cfi-asm -fearly-inlining 14 # -feliminate-unused-debug-types -ffp-int-builtin-inexact -ffunction-cse 15 # -fgcse-lm -fgnu-runtime -fgnu-unique -fident -finline-atomics 16 # -fipa-stack-alignment -fira-hoist-pressure -fira-share-save-slots 17 # -fira-share-spill-slots -fivopts -fkeep-inline-dllexport 18 # -fkeep-static-consts -fleading-underscore -flifetime-dse 19 # -flto-odr-type-merging -fmath-errno -fmerge-debug-strings -fpeephole 20 # -fpic -fplt -fprefetch-loop-arrays -freg-struct-return 21 # -fsched-critical-path-heuristic -fsched-dep-count-heuristic 22 # -fsched-group-heuristic -fsched-interblock -fsched-last-insn-heuristic 23 # -fsched-rank-heuristic -fsched-spec -fsched-spec-insn-heuristic 24 # -fsched-stalled-insns-dep -fschedule-fusion -fsemantic-interposition 25 # -fset-stack-executable -fshow-column -fshrink-wrap-separate 26 # -fsigned-zeros -fsplit-ivs-in-unroller -fssa-backprop -fstdarg-opt 27 # -fstrict-volatile-bitfields -fsync-libcalls -ftrapping-math 28 # -ftree-cselim -ftree-forwprop -ftree-loop-if-convert -ftree-loop-im 29 # -ftree-loop-ivcanon -ftree-loop-optimize -ftree-parallelize-loops= 30 # -ftree-phiprop -ftree-reassoc -ftree-scev-cprop -funit-at-a-time 31 # -funwind-tables -fverbose-asm -fzero-initialized-in-bss 32 # -m128bit-long-double -m64 -m80387 -maccumulate-outgoing-args 33 # -malign-double -malign-stringops -mavx256-split-unaligned-load 34 # -mavx256-split-unaligned-store -mfancy-math-387 -mfentry -mfp-ret-in-387 35 # -mfxsr -mieee-fp -mlong-double-80 -mmmx -mno-sse4 -mpush-args -mred-zone 36 # -msse -msse2 -mstack-arg-probe -mstackrealign -mvzeroupper 37 38 .text 39 .globl foo 40 .def foo; .scl 2; .type 32; .endef 41 .seh_proc foo 42foo: 43 pushq %rbp # 44 .seh_pushreg %rbp 45 movq %rsp, %rbp #, 46 .seh_setframe %rbp, 0 47 .seh_endprologue 48 # gen.c:8: DEFINE(SIZE_PTR, sizeof(void*)); 49/APP 50 # 8 "gen.c" 1 51 52->SIZE_PTR $8 sizeof(void*) # 53 # 0 "" 2 54 # gen.c:9: } 55/NO_APP 56 nop 57 popq %rbp # 58 ret 59 .seh_endproc 60 .ident "GCC: (GNU) 9.1.0"
ここから、行頭の->
を目印に抽出して置換し
c
1// gen.h 2#define SIZE_PTR 8 /* sizeof(void*) */
を作り
asm
1# other.S 2#include "gen.h" 3push SIZE_PTR
gcc -c other.S
(拡張子が大文字のS
な事に注意)
的に使います。
投稿2020/04/15 16:52
総合スコア15149
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/16 01:26
2020/04/16 03:38
2020/04/16 09:40
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。