mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-14 00:32:55 +00:00
Fix a bug in our autoupgrade support: in an argument list to a function
call, we should treat "i64 zext" as the start of a constant expr, but "i64 0 zext" as an argument with an obsolete attribute on it (this form is already tested by test/Assembler/2007-07-30-AutoUpgradeZextSext.ll). Make the autoupgrade logic more discerning to avoid treating "i64 zext" as an old-style attribute, causing us to reject a valid constant expr. This fixes PR3876. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@67682 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0c8f7dc67c
commit
ad9ad7c827
@ -678,6 +678,7 @@ bool LLParser::ParseOptionalAddrSpace(unsigned &AddrSpace) {
|
|||||||
/// ParseOptionalAttrs - Parse a potentially empty attribute list. AttrKind
|
/// ParseOptionalAttrs - Parse a potentially empty attribute list. AttrKind
|
||||||
/// indicates what kind of attribute list this is: 0: function arg, 1: result,
|
/// indicates what kind of attribute list this is: 0: function arg, 1: result,
|
||||||
/// 2: function attr.
|
/// 2: function attr.
|
||||||
|
/// 3: function arg after value: FIXME: REMOVE IN LLVM 3.0
|
||||||
bool LLParser::ParseOptionalAttrs(unsigned &Attrs, unsigned AttrKind) {
|
bool LLParser::ParseOptionalAttrs(unsigned &Attrs, unsigned AttrKind) {
|
||||||
Attrs = Attribute::None;
|
Attrs = Attribute::None;
|
||||||
LocTy AttrLoc = Lex.getLoc();
|
LocTy AttrLoc = Lex.getLoc();
|
||||||
@ -686,9 +687,12 @@ bool LLParser::ParseOptionalAttrs(unsigned &Attrs, unsigned AttrKind) {
|
|||||||
switch (Lex.getKind()) {
|
switch (Lex.getKind()) {
|
||||||
case lltok::kw_sext:
|
case lltok::kw_sext:
|
||||||
case lltok::kw_zext:
|
case lltok::kw_zext:
|
||||||
// Treat these as signext/zeroext unless they are function attrs.
|
// Treat these as signext/zeroext if they occur in the argument list after
|
||||||
|
// the value, as in "call i8 @foo(i8 10 sext)". If they occur before the
|
||||||
|
// value, as in "call i8 @foo(i8 sext (" then it is part of a constant
|
||||||
|
// expr.
|
||||||
// FIXME: REMOVE THIS IN LLVM 3.0
|
// FIXME: REMOVE THIS IN LLVM 3.0
|
||||||
if (AttrKind != 2) {
|
if (AttrKind == 3) {
|
||||||
if (Lex.getKind() == lltok::kw_sext)
|
if (Lex.getKind() == lltok::kw_sext)
|
||||||
Attrs |= Attribute::SExt;
|
Attrs |= Attribute::SExt;
|
||||||
else
|
else
|
||||||
@ -700,7 +704,7 @@ bool LLParser::ParseOptionalAttrs(unsigned &Attrs, unsigned AttrKind) {
|
|||||||
if (AttrKind != 2 && (Attrs & Attribute::FunctionOnly))
|
if (AttrKind != 2 && (Attrs & Attribute::FunctionOnly))
|
||||||
return Error(AttrLoc, "invalid use of function-only attribute");
|
return Error(AttrLoc, "invalid use of function-only attribute");
|
||||||
|
|
||||||
if (AttrKind != 0 && (Attrs & Attribute::ParameterOnly))
|
if (AttrKind != 0 && AttrKind != 3 && (Attrs & Attribute::ParameterOnly))
|
||||||
return Error(AttrLoc, "invalid use of parameter-only attribute");
|
return Error(AttrLoc, "invalid use of parameter-only attribute");
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@ -1085,7 +1089,7 @@ bool LLParser::ParseParameterList(SmallVectorImpl<ParamInfo> &ArgList,
|
|||||||
ParseValue(ArgTy, V, PFS) ||
|
ParseValue(ArgTy, V, PFS) ||
|
||||||
// FIXME: Should not allow attributes after the argument, remove this in
|
// FIXME: Should not allow attributes after the argument, remove this in
|
||||||
// LLVM 3.0.
|
// LLVM 3.0.
|
||||||
ParseOptionalAttrs(ArgAttrs2, 0))
|
ParseOptionalAttrs(ArgAttrs2, 3))
|
||||||
return true;
|
return true;
|
||||||
ArgList.push_back(ParamInfo(ArgLoc, V, ArgAttrs1|ArgAttrs2));
|
ArgList.push_back(ParamInfo(ArgLoc, V, ArgAttrs1|ArgAttrs2));
|
||||||
}
|
}
|
||||||
|
11
test/Assembler/2009-03-24-ZextConstantExpr.ll
Normal file
11
test/Assembler/2009-03-24-ZextConstantExpr.ll
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
; RUN: llvm-as < %s | llvm-dis
|
||||||
|
; PR3876
|
||||||
|
@gdtr = external global [0 x i8]
|
||||||
|
|
||||||
|
define void @test() {
|
||||||
|
call zeroext i1 @paging_map(i64 zext (i32 and (i32 ptrtoint ([0 x i8]* @gdtr to i32), i32 -4096) to i64))
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
declare zeroext i1 @paging_map(i64)
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user