mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-26 23:29:22 +00:00
[ms-inline asm] Add a new Inline Asm Non-Standard Dialect attribute.
This new attribute is intended to be used by the backend to determine how the inline asm string should be parsed/printed. This patch adds the ia_nsdialect attribute and also adds a test case to ensure the IR is correctly parsed, but there is no functional change at this time. The standard dialect is assumed to be AT&T. Therefore, this attribute should only be added to MS-style inline assembly statements, which use the Intel dialect. If we ever support more dialects we'll need to add additional state to the attribute. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@161641 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1134aae4e7
commit
249d670dd0
@ -1208,6 +1208,13 @@ define void @f() optsize { ... }
|
|||||||
may make calls to the function faster, at the cost of extra program
|
may make calls to the function faster, at the cost of extra program
|
||||||
startup time if the function is not called during program startup.</dd>
|
startup time if the function is not called during program startup.</dd>
|
||||||
|
|
||||||
|
<dt><tt><b>ia_nsdialect</b></tt></dt>
|
||||||
|
<dd>This attribute indicates the associated inline assembly call is using a
|
||||||
|
non-standard assembly dialect. The standard dialect is ATT, which is
|
||||||
|
assumed when this attribute is not present. When present, the dialect
|
||||||
|
is assumed to be Intel. Currently, ATT and Intel are the only supported
|
||||||
|
dialects.</dd>
|
||||||
|
|
||||||
<dt><tt><b>inlinehint</b></tt></dt>
|
<dt><tt><b>inlinehint</b></tt></dt>
|
||||||
<dd>This attribute indicates that the source code contained a hint that inlining
|
<dd>This attribute indicates that the source code contained a hint that inlining
|
||||||
this function is desirable (such as the "inline" keyword in C/C++). It
|
this function is desirable (such as the "inline" keyword in C/C++). It
|
||||||
|
@ -134,6 +134,9 @@ DECLARE_LLVM_ATTRIBUTE(NonLazyBind,1U<<31) ///< Function is called early and/or
|
|||||||
/// often, so lazy binding isn't
|
/// often, so lazy binding isn't
|
||||||
/// worthwhile.
|
/// worthwhile.
|
||||||
DECLARE_LLVM_ATTRIBUTE(AddressSafety,1ULL<<32) ///< Address safety checking is on.
|
DECLARE_LLVM_ATTRIBUTE(AddressSafety,1ULL<<32) ///< Address safety checking is on.
|
||||||
|
DECLARE_LLVM_ATTRIBUTE(IANSDialect,1ULL<<33) ///< Inline asm non-standard dialect.
|
||||||
|
/// When not set, ATT dialect assumed.
|
||||||
|
/// When set implies the Intel dialect.
|
||||||
|
|
||||||
#undef DECLARE_LLVM_ATTRIBUTE
|
#undef DECLARE_LLVM_ATTRIBUTE
|
||||||
|
|
||||||
@ -159,7 +162,8 @@ const AttrConst FunctionOnly = {NoReturn_i | NoUnwind_i | ReadNone_i |
|
|||||||
ReadOnly_i | NoInline_i | AlwaysInline_i | OptimizeForSize_i |
|
ReadOnly_i | NoInline_i | AlwaysInline_i | OptimizeForSize_i |
|
||||||
StackProtect_i | StackProtectReq_i | NoRedZone_i | NoImplicitFloat_i |
|
StackProtect_i | StackProtectReq_i | NoRedZone_i | NoImplicitFloat_i |
|
||||||
Naked_i | InlineHint_i | StackAlignment_i |
|
Naked_i | InlineHint_i | StackAlignment_i |
|
||||||
UWTable_i | NonLazyBind_i | ReturnsTwice_i | AddressSafety_i};
|
UWTable_i | NonLazyBind_i | ReturnsTwice_i | AddressSafety_i |
|
||||||
|
IANSDialect_i};
|
||||||
|
|
||||||
/// @brief Parameter attributes that do not apply to vararg call arguments.
|
/// @brief Parameter attributes that do not apply to vararg call arguments.
|
||||||
const AttrConst VarArgsIncompatible = {StructRet_i};
|
const AttrConst VarArgsIncompatible = {StructRet_i};
|
||||||
|
@ -553,6 +553,7 @@ lltok::Kind LLLexer::LexIdentifier() {
|
|||||||
KEYWORD(naked);
|
KEYWORD(naked);
|
||||||
KEYWORD(nonlazybind);
|
KEYWORD(nonlazybind);
|
||||||
KEYWORD(address_safety);
|
KEYWORD(address_safety);
|
||||||
|
KEYWORD(ia_nsdialect);
|
||||||
|
|
||||||
KEYWORD(type);
|
KEYWORD(type);
|
||||||
KEYWORD(opaque);
|
KEYWORD(opaque);
|
||||||
|
@ -962,6 +962,7 @@ bool LLParser::ParseOptionalAttrs(Attributes &Attrs, unsigned AttrKind) {
|
|||||||
case lltok::kw_naked: Attrs |= Attribute::Naked; break;
|
case lltok::kw_naked: Attrs |= Attribute::Naked; break;
|
||||||
case lltok::kw_nonlazybind: Attrs |= Attribute::NonLazyBind; break;
|
case lltok::kw_nonlazybind: Attrs |= Attribute::NonLazyBind; break;
|
||||||
case lltok::kw_address_safety: Attrs |= Attribute::AddressSafety; break;
|
case lltok::kw_address_safety: Attrs |= Attribute::AddressSafety; break;
|
||||||
|
case lltok::kw_ia_nsdialect: Attrs |= Attribute::IANSDialect; break;
|
||||||
|
|
||||||
case lltok::kw_alignstack: {
|
case lltok::kw_alignstack: {
|
||||||
unsigned Alignment;
|
unsigned Alignment;
|
||||||
|
@ -105,6 +105,7 @@ namespace lltok {
|
|||||||
kw_naked,
|
kw_naked,
|
||||||
kw_nonlazybind,
|
kw_nonlazybind,
|
||||||
kw_address_safety,
|
kw_address_safety,
|
||||||
|
kw_ia_nsdialect,
|
||||||
|
|
||||||
kw_type,
|
kw_type,
|
||||||
kw_opaque,
|
kw_opaque,
|
||||||
|
@ -88,6 +88,9 @@ std::string Attribute::getAsString(Attributes Attrs) {
|
|||||||
Result += utostr(Attribute::getAlignmentFromAttrs(Attrs));
|
Result += utostr(Attribute::getAlignmentFromAttrs(Attrs));
|
||||||
Result += " ";
|
Result += " ";
|
||||||
}
|
}
|
||||||
|
if (Attrs & Attribute::IANSDialect)
|
||||||
|
Result += "ia_nsdialect ";
|
||||||
|
|
||||||
// Trim the trailing space.
|
// Trim the trailing space.
|
||||||
assert(!Result.empty() && "Unknown attribute!");
|
assert(!Result.empty() && "Unknown attribute!");
|
||||||
Result.erase(Result.end()-1);
|
Result.erase(Result.end()-1);
|
||||||
|
@ -175,6 +175,7 @@ FuncAttr ::= noreturn
|
|||||||
| returns_twice
|
| returns_twice
|
||||||
| nonlazybind
|
| nonlazybind
|
||||||
| address_safety
|
| address_safety
|
||||||
|
| ia_nsdialect
|
||||||
;
|
;
|
||||||
|
|
||||||
OptFuncAttrs ::= + _ | OptFuncAttrs FuncAttr ;
|
OptFuncAttrs ::= + _ | OptFuncAttrs FuncAttr ;
|
||||||
|
Loading…
Reference in New Issue
Block a user