aboutsummaryrefslogtreecommitdiffstats
path: root/lib/VMCore/InlineAsm.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-02-02 00:23:53 +0000
committerChris Lattner <sabre@nondot.org>2006-02-02 00:23:53 +0000
commit2f0eec6520f9c8bb5cf51251ae735846fc8f2522 (patch)
tree4f4fe953968a1a86078edc2b337c970e06e1fb63 /lib/VMCore/InlineAsm.cpp
parentab77f73aeeefa5e572b2bae8216023f2aeaea4ec (diff)
downloadexternal_llvm-2f0eec6520f9c8bb5cf51251ae735846fc8f2522.zip
external_llvm-2f0eec6520f9c8bb5cf51251ae735846fc8f2522.tar.gz
external_llvm-2f0eec6520f9c8bb5cf51251ae735846fc8f2522.tar.bz2
validate matching constraints and remember when we see them.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25892 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/InlineAsm.cpp')
-rw-r--r--lib/VMCore/InlineAsm.cpp20
1 files changed, 15 insertions, 5 deletions
diff --git a/lib/VMCore/InlineAsm.cpp b/lib/VMCore/InlineAsm.cpp
index 5436720..cdb8c46 100644
--- a/lib/VMCore/InlineAsm.cpp
+++ b/lib/VMCore/InlineAsm.cpp
@@ -42,13 +42,15 @@ const FunctionType *InlineAsm::getFunctionType() const {
/// Parse - Analyze the specified string (e.g. "==&{eax}") and fill in the
/// fields in this structure. If the constraint string is not understood,
/// return true, otherwise return false.
-bool InlineAsm::ConstraintInfo::Parse(const std::string &Str) {
+bool InlineAsm::ConstraintInfo::Parse(const std::string &Str,
+ std::vector<InlineAsm::ConstraintInfo> &ConstraintsSoFar) {
std::string::const_iterator I = Str.begin(), E = Str.end();
// Initialize
Type = isInput;
isEarlyClobber = false;
- isIndirectOutput =false;
+ isIndirectOutput = false;
+ hasMatchingInput = false;
// Parse the prefix.
if (*I == '~') {
@@ -94,12 +96,20 @@ bool InlineAsm::ConstraintInfo::Parse(const std::string &Str) {
if (ConstraintEnd == E) return true; // "{foo"
Codes.push_back(std::string(I, ConstraintEnd+1));
I = ConstraintEnd+1;
- } else if (isdigit(*I)) {
+ } else if (isdigit(*I)) { // Matching Constraint
// Maximal munch numbers.
std::string::const_iterator NumStart = I;
while (I != E && isdigit(*I))
++I;
Codes.push_back(std::string(NumStart, I));
+ unsigned N = atoi(Codes.back().c_str());
+ // Check that this is a valid matching constraint!
+ if (N >= ConstraintsSoFar.size() || ConstraintsSoFar[N].Type != isOutput||
+ Type != isInput)
+ return true; // Invalid constraint number.
+
+ // Note that operand #n has a matching input.
+ ConstraintsSoFar[N].hasMatchingInput = true;
} else {
// Single letter constraint.
Codes.push_back(std::string(I, I+1));
@@ -123,8 +133,8 @@ InlineAsm::ParseConstraints(const std::string &Constraints) {
std::string::const_iterator ConstraintEnd = std::find(I, E, ',');
if (ConstraintEnd == I || // Empty constraint like ",,"
- Info.Parse(std::string(I, ConstraintEnd))) { // Erroneous constraint?
- Result.clear();
+ Info.Parse(std::string(I, ConstraintEnd), Result)) {
+ Result.clear(); // Erroneous constraint?
break;
}