diff options
author | David Majnemer <david.majnemer@gmail.com> | 2015-01-10 10:43:19 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2015-01-10 10:43:19 +0000 |
commit | a0040df38c96866f6f970ad0ab45e3185faceb02 (patch) | |
tree | cdafccdf358585b2c5b6c5836268ec7e8fc9b66f /clang/lib/Basic | |
parent | 9e6d12b98c2663046a257b0c3a84a6c74ccafbdc (diff) | |
download | bcm5719-llvm-a0040df38c96866f6f970ad0ab45e3185faceb02.tar.gz bcm5719-llvm-a0040df38c96866f6f970ad0ab45e3185faceb02.zip |
Sema: The asm constraint '+&m' isn't valid, reject it
Don't permit '+&m' to make it to CodeGen, it's invalid.
llvm-svn: 225586
Diffstat (limited to 'clang/lib/Basic')
-rw-r--r-- | clang/lib/Basic/TargetInfo.cpp | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp index f2dc84fa034..aabb70dd6b1 100644 --- a/clang/lib/Basic/TargetInfo.cpp +++ b/clang/lib/Basic/TargetInfo.cpp @@ -459,7 +459,9 @@ bool TargetInfo::validateOutputConstraint(ConstraintInfo &Info) const { // Eventually, an unknown constraint should just be treated as 'g'. return false; } + break; case '&': // early clobber. + Info.setEarlyClobber(); break; case '%': // commutative. // FIXME: Check that there is a another register after this one. @@ -494,6 +496,11 @@ bool TargetInfo::validateOutputConstraint(ConstraintInfo &Info) const { Name++; } + // Early clobber with a read-write constraint which doesn't permit registers + // is invalid. + if (Info.earlyClobber() && Info.isReadWrite() && !Info.allowsRegister()) + return false; + // If a constraint allows neither memory nor register operands it contains // only modifiers. Reject it. return Info.allowsMemory() || Info.allowsRegister(); |