LLParser: Accept align(N) as new syntax for parameter attribute

Every other value parameter attribute uses parentheses, so accept this
as the preferred modern syntax. Updating everything to use the new
syntax is left for a future change.
This commit is contained in:
Matt Arsenault 2020-06-26 16:02:25 -04:00
parent 443556c18f
commit b091c9a3e1
7 changed files with 51 additions and 4 deletions

View File

@ -1130,7 +1130,7 @@ Currently, only the following parameter attributes are defined:
.. _attr_align: .. _attr_align:
``align <n>`` ``align <n>`` or ``align(<n>)``
This indicates that the pointer value may be assumed by the optimizer to This indicates that the pointer value may be assumed by the optimizer to
have the specified alignment. If the pointer value does not have the have the specified alignment. If the pointer value does not have the
specified alignment, behavior is undefined. specified alignment, behavior is undefined.

View File

@ -1641,7 +1641,7 @@ bool LLParser::ParseOptionalParamAttrs(AttrBuilder &B) {
} }
case lltok::kw_align: { case lltok::kw_align: {
MaybeAlign Alignment; MaybeAlign Alignment;
if (ParseOptionalAlignment(Alignment)) if (ParseOptionalAlignment(Alignment, true))
return true; return true;
B.addAlignmentAttr(Alignment); B.addAlignmentAttr(Alignment);
continue; continue;
@ -2127,14 +2127,26 @@ bool LLParser::ParseOptionalFunctionMetadata(Function &F) {
/// ParseOptionalAlignment /// ParseOptionalAlignment
/// ::= /* empty */ /// ::= /* empty */
/// ::= 'align' 4 /// ::= 'align' 4
bool LLParser::ParseOptionalAlignment(MaybeAlign &Alignment) { bool LLParser::ParseOptionalAlignment(MaybeAlign &Alignment, bool AllowParens) {
Alignment = None; Alignment = None;
if (!EatIfPresent(lltok::kw_align)) if (!EatIfPresent(lltok::kw_align))
return false; return false;
LocTy AlignLoc = Lex.getLoc(); LocTy AlignLoc = Lex.getLoc();
uint32_t Value = 0; uint32_t Value = 0;
LocTy ParenLoc = Lex.getLoc();
bool HaveParens = false;
if (AllowParens) {
if (EatIfPresent(lltok::lparen))
HaveParens = true;
}
if (ParseUInt32(Value)) if (ParseUInt32(Value))
return true; return true;
if (HaveParens && !EatIfPresent(lltok::rparen))
return Error(ParenLoc, "expected ')'");
if (!isPowerOf2_32(Value)) if (!isPowerOf2_32(Value))
return Error(AlignLoc, "alignment is not a power of two"); return Error(AlignLoc, "alignment is not a power of two");
if (Value > Value::MaximumAlignment) if (Value > Value::MaximumAlignment)

View File

@ -272,7 +272,8 @@ namespace llvm {
void ParseOptionalVisibility(unsigned &Res); void ParseOptionalVisibility(unsigned &Res);
void ParseOptionalDLLStorageClass(unsigned &Res); void ParseOptionalDLLStorageClass(unsigned &Res);
bool ParseOptionalCallingConv(unsigned &CC); bool ParseOptionalCallingConv(unsigned &CC);
bool ParseOptionalAlignment(MaybeAlign &Alignment); bool ParseOptionalAlignment(MaybeAlign &Alignment,
bool AllowParens = false);
bool ParseOptionalDerefAttrBytes(lltok::Kind AttrKind, uint64_t &Bytes); bool ParseOptionalDerefAttrBytes(lltok::Kind AttrKind, uint64_t &Bytes);
bool ParseScopeAndOrdering(bool isAtomic, SyncScope::ID &SSID, bool ParseScopeAndOrdering(bool isAtomic, SyncScope::ID &SSID,
AtomicOrdering &Ordering); AtomicOrdering &Ordering);

View File

@ -0,0 +1,7 @@
; RUN: not llvm-as < %s 2>&1 | FileCheck %s
; Test parse errors when using form of align attribute with parentheses
; CHECK: <stdin>:[[@LINE+1]]:38: error: expected ')'
define void @missing_rparen(i8* align(4 %ptr) {
ret void
}

View File

@ -0,0 +1,7 @@
; RUN: not llvm-as < %s 2>&1 | FileCheck %s
; Test parse errors when using form of align attribute with parentheses
; CHECK: <stdin>:[[@LINE+1]]:42: error: expected '{' in function body
define void @missing_Lparen(i8* align 4) %ptr) {
ret void
}

View File

@ -0,0 +1,7 @@
; RUN: not llvm-as < %s 2>&1 | FileCheck %s
; Test parse errors when using form of align attribute with parentheses
; CHECK: <stdin>:[[@LINE+1]]:39: error: expected integer
define void @missing_value(i8* align () %ptr) {
ret void
}

View File

@ -0,0 +1,13 @@
; RUN: llvm-as < %s | llvm-dis | llvm-as | llvm-dis | FileCheck %s
; Test that align(N) is accepted as an alternative syntax to align N
; CHECK: define void @param_align4(i8* align 4 %ptr) {
define void @param_align4(i8* align(4) %ptr) {
ret void
}
; CHECK: define void @param_align128(i8* align 128 %0) {
define void @param_align128(i8* align(128)) {
ret void
}