Currently string attributes on function arguments/return values can be generated using LLVM API. However they are not supported in parser. So, the following scenario will fail:

* generate function with string attribute using API,
* dump it in LL format,
* try to parse.
Add parser support for string attributes to fix the issue.

Reviewed By: reames, hfinkel

Differential Revision: http://reviews.llvm.org/D11058

llvm-svn: 243877
This commit is contained in:
Artur Pilipenko 2015-08-03 14:31:49 +00:00
parent 56e4a6af06
commit f28b982862
3 changed files with 36 additions and 7 deletions

View File

@ -915,14 +915,8 @@ bool LLParser::ParseFnAttributeValuePairs(AttrBuilder &B,
}
// Target-dependent attributes:
case lltok::StringConstant: {
std::string Attr = Lex.getStrVal();
Lex.Lex();
std::string Val;
if (EatIfPresent(lltok::equal) &&
ParseStringConstant(Val))
if (ParseStringAttribute(B))
return true;
B.addAttribute(Attr, Val);
continue;
}
@ -1229,6 +1223,19 @@ bool LLParser::ParseOptionalAddrSpace(unsigned &AddrSpace) {
ParseToken(lltok::rparen, "expected ')' in address space");
}
/// ParseStringAttribute
/// := StringConstant
/// := StringConstant '=' StringConstant
bool LLParser::ParseStringAttribute(AttrBuilder &B) {
std::string Attr = Lex.getStrVal();
Lex.Lex();
std::string Val;
if (EatIfPresent(lltok::equal) && ParseStringConstant(Val))
return true;
B.addAttribute(Attr, Val);
return false;
}
/// ParseOptionalParamAttrs - Parse a potentially empty list of parameter attributes.
bool LLParser::ParseOptionalParamAttrs(AttrBuilder &B) {
bool HaveError = false;
@ -1240,6 +1247,11 @@ bool LLParser::ParseOptionalParamAttrs(AttrBuilder &B) {
switch (Token) {
default: // End of attributes.
return HaveError;
case lltok::StringConstant: {
if (ParseStringAttribute(B))
return true;
continue;
}
case lltok::kw_align: {
unsigned Alignment;
if (ParseOptionalAlignment(Alignment))
@ -1321,6 +1333,11 @@ bool LLParser::ParseOptionalReturnAttrs(AttrBuilder &B) {
switch (Token) {
default: // End of attributes.
return HaveError;
case lltok::StringConstant: {
if (ParseStringAttribute(B))
return true;
continue;
}
case lltok::kw_dereferenceable: {
uint64_t Bytes;
if (ParseOptionalDerefAttrBytes(lltok::kw_dereferenceable, Bytes))

View File

@ -215,6 +215,8 @@ namespace llvm {
return ParseUInt64(Val);
}
bool ParseStringAttribute(AttrBuilder &B);
bool ParseTLSModel(GlobalVariable::ThreadLocalMode &TLM);
bool ParseOptionalThreadLocal(GlobalVariable::ThreadLocalMode &TLM);
bool parseOptionalUnnamedAddr(bool &UnnamedAddr) {

View File

@ -262,6 +262,16 @@ define void @f44() argmemonly
ret void;
}
; CHECK: define "string_attribute" void @f45(i32 "string_attribute")
define "string_attribute" void @f45(i32 "string_attribute") {
ret void
}
; CHECK: define "string_attribute_with_value"="value" void @f46(i32 "string_attribute_with_value"="value")
define "string_attribute_with_value"="value" void @f46(i32 "string_attribute_with_value"="value") {
ret void
}
; CHECK: attributes #0 = { noreturn }
; CHECK: attributes #1 = { nounwind }
; CHECK: attributes #2 = { readnone }