Ответ 1
У меня был ответ на cfe-dev (список разработчиков front clang) от одного из разработчиков:
LLVM в настоящее время всегда разливает ограничения "rm", чтобы упростить обработка встроенного asm в бэкэнд (вы можете спросить на llvmdev, если хотите Детали). Я не знаю никаких планов исправить это в ближайшем будущем.
Итак, это явно "известная" проблема. Одна из целей clang - правильно обработать синтаксис gcc inline assembly, среди других расширений, который он делает в этом случае - просто не очень эффективно. Короче говоря, это не ошибка, сама по себе.
Так как это не ошибка, я продолжу синтаксис ограничения "r,m"
. Я полагаю, что это лучший компромисс. gcc
выберет наилучший - предположительно, регистр, где это возможно - и clang
заставит использовать регистр, игнорируя дополнительные параметры после запятой. Если ничего другого, он по-прежнему сохраняет смысловое намерение оператора сборки, то есть описывает возможные ограничения, даже если они игнорируются.
Последнее примечание (20130715): Этот конкретный пример не будет компилироваться с использованием ограничения "r,m"
в одной позиции - нам нужно будет предоставить альтернативное соответствие ограничений для каждого, например,
: "=a,a" (rl), "=d,d" (rh) : "%0,0" (x), "r,m" (y)
Это требуется для нескольких альтернативных ограничений с помощью GCC. Но мы попадаем на территорию, где, как известно, GCC обнаруживает ошибки в прошлом - независимо от того, действительно ли это или нет: 4.8.1, я не знаю. Clang работает без альтернатив в других ограничениях, что несовместимо с синтаксисом GCC и поэтому должно считаться ошибкой.
Если производительность критическая, используйте "r"
, иначе придерживайтесь "rm"
, и, возможно, clang обратится к ней в будущем, даже если она приносит пользу GCC.