Почему ржавчина производит совершенно разные сборки с пабом и без него и # [no_mangle]? - PullRequest
0 голосов
/ 04 апреля 2019

Код ржавчины, о котором идет речь:

#[no_mangle]
fn add(a: isize, b: isize) -> isize {
    a + b
}

Создает следующий код сборки при использовании с командой rustc rustc add.rs --crate-type=lib --emit=asm -C opt-level=z:

    .text
    .file   "add.3a1fbbbh-cgu.0"
    .section    .text.add,"ax",@progbits
    .globl  add
    .type   add,@function
add:
    .cfi_startproc
    leaq    (%rdi,%rsi), %rax
    retq
.Lfunc_end0:
    .size   add, .Lfunc_end0-add
    .cfi_endproc

    .section    ".note.GNU-stack","",@progbits

И следующее без #[no_mangle]:

    .text
    .file   "add.3a1fbbbh-cgu.0"

    .section    ".note.GNU-stack","",@progbits

Почему это так?Разве это не должно просто поменять add на что-то вроде _Zaddm без проступка?

1 Ответ

3 голосов
/ 04 апреля 2019

Без #[no_mangle] код вообще не генерируется (то, что вы видите, это просто директивы ассемблера, фактического кода нет).Я предполагаю, что компилятор решит, что функция всегда будет встроенной, поэтому нет необходимости действительно генерировать код для нее (особенно если вы оптимизируете размер и добавление двух значений в строке никогда не будет больше, чем вызов функции).

Единственная причина, по которой вы захотите #[no_mangle], - это если вы планируете вызывать функцию из-за пределов Rust.Такой вызов не может быть встроен по очевидной причине, поэтому я предполагаю, что компилятор действительно генерирует код, чтобы сделать эти внешние вызовы возможными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...