Можно ли использовать псевдонимы llvm для межмодульных или только для внутримодульных? - PullRequest
0 голосов
/ 10 апреля 2020

LLVM определяет псевдонимы для глобальных значений :

@<Name> = [Linkage] [PreemptionSpecifier] [Visibility] [DLLStorageClass] [ThreadLocal] [(unnamed_addr|local_unnamed_addr)] alias <AliaseeTy>, <AliaseeTy>* @<Aliasee>

Какие допустимые значения <Aliasee>?

  1. Только имена, встречающиеся где-то еще в текущие модули или
  2. также имена, которые встречаются в других модулях, которые будут связаны позже?

Я думал, что межмодульные псевдонимы были разрешены, но я не могу заставить его работать. Я продолжаю получать ошибки этого типа:

<string>:5:39: error: use of undefined value '@my_name'
@"MyAlias" = external alias i32, i32* @my_name
                                      ^

Примечание: @my_name не определено в текущем модуле. Он определен в другом модуле.

1 Ответ

0 голосов
/ 12 апреля 2020

Все, что представлено в LLVM IR, должно быть объявлено. Ваш my_name также должен быть объявлен. Обратите внимание, что псевдонимы создаются для существующего определения. См. Раздел «Ограничения» в руководстве:

Поскольку псевдонимы являются только вторым именем, применяются некоторые ограничения, некоторые из которых можно проверить только при создании объектного файла:

  • Выражение, определяющее псевдоним, должно быть вычисляемым во время сборки. Поскольку это просто имя, никакие перемещения не могут быть использованы.
  • Ни один псевдоним в выражении не может быть слабым, поскольку возможность переопределения промежуточного псевдонима не может быть представлена ​​в объектном файле.
  • Никакое глобальное значение в выражении не может быть объявлением, поскольку для этого потребуется перемещение, что невозможно.
...