diff options
| author | Anders Carlsson <andersca@mac.com> | 2007-11-22 01:36:19 +0000 |
|---|---|---|
| committer | Anders Carlsson <andersca@mac.com> | 2007-11-22 01:36:19 +0000 |
| commit | b235fc2cf37621c7fc6511bb2b8788c95f9fb9fc (patch) | |
| tree | a2b0fb6869618dacf397e2d9d133d27059e22a13 /AST/StmtSerialization.cpp | |
| parent | eecf847d1e46f4e1f7386ba3e624e2c8f31fa953 (diff) | |
Store output and input operands as well as clobber information in the AsmStmt. Ted, could you please review the serialization/deserialization code?
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44266 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'AST/StmtSerialization.cpp')
| -rw-r--r-- | AST/StmtSerialization.cpp | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/AST/StmtSerialization.cpp b/AST/StmtSerialization.cpp index f2c7834e72..46f8559c6c 100644 --- a/AST/StmtSerialization.cpp +++ b/AST/StmtSerialization.cpp @@ -197,8 +197,27 @@ ArraySubscriptExpr* ArraySubscriptExpr::CreateImpl(Deserializer& D) { void AsmStmt::EmitImpl(Serializer& S) const { S.Emit(AsmLoc); + getAsmString()->EmitImpl(S); S.Emit(RParenLoc); + + S.EmitInt(NumOutputs); + S.EmitInt(NumInputs); + + unsigned size = NumOutputs + NumInputs; + + for (unsigned i = 0; i < size; ++i) + S.EmitCStr(Names[i].c_str()); + + for (unsigned i = 0; i < size; ++i) + Constraints[i]->EmitImpl(S); + + for (unsigned i = 0; i < size; ++i) + S.EmitOwnedPtr(Exprs[i]); + + S.EmitInt(Clobbers.size()); + for (unsigned i = 0, e = Clobbers.size(); i != e; ++i) + Clobbers[i]->EmitImpl(S); } AsmStmt* AsmStmt::CreateImpl(Deserializer& D) { @@ -206,7 +225,37 @@ AsmStmt* AsmStmt::CreateImpl(Deserializer& D) { StringLiteral *AsmStr = StringLiteral::CreateImpl(D); SourceLocation PLoc = SourceLocation::ReadVal(D); - return new AsmStmt(ALoc, AsmStr, PLoc); + AsmStmt *Stmt = new AsmStmt(ALoc, 0, 0, 0, 0, 0, + AsmStr, + 0, 0, PLoc); + + Stmt->NumOutputs = D.ReadInt(); + Stmt->NumInputs = D.ReadInt(); + + unsigned size = Stmt->NumOutputs + Stmt->NumInputs; + + Stmt->Names.reserve(size); + for (unsigned i = 0; i < size; ++i) { + std::vector<char> data; + D.ReadCStr(data, false); + + Stmt->Names.push_back(std::string(&data[0], data.size())); + } + + Stmt->Constraints.reserve(size); + for (unsigned i = 0; i < size; ++i) + Stmt->Constraints.push_back(StringLiteral::CreateImpl(D)); + + Stmt->Exprs.reserve(size); + for (unsigned i = 0; i < size; ++i) + Stmt->Exprs.push_back(D.ReadOwnedPtr<Expr>()); + + unsigned NumClobbers = D.ReadInt(); + Stmt->Clobbers.reserve(NumClobbers); + for (unsigned i = 0; i < NumClobbers; ++i) + Stmt->Clobbers.push_back(StringLiteral::CreateImpl(D)); + + return Stmt; } void BinaryOperator::EmitImpl(Serializer& S) const { |
