mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-02 00:16:25 +00:00
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:
parent
56e4a6af06
commit
f28b982862
@ -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))
|
||||
|
@ -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) {
|
||||
|
@ -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 }
|
||||
|
Loading…
Reference in New Issue
Block a user