mirror of
https://github.com/intel/llvm.git
synced 2026-02-05 22:17:23 +08:00
[ms-inline asm] Refactor code. No functional change intended.
llvm-svn: 162568
This commit is contained in:
@@ -1458,6 +1458,8 @@ public:
|
||||
unsigned AnalyzeAsmString(SmallVectorImpl<AsmStringPiece> &Pieces,
|
||||
ASTContext &C, unsigned &DiagOffs) const;
|
||||
|
||||
/// GenerateAsmString - Assemble final asm string.
|
||||
std::string GenerateAsmString(ASTContext &C) const;
|
||||
|
||||
//===--- Output operands ---===//
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#include "clang/AST/ASTContext.h"
|
||||
#include "clang/AST/ASTDiagnostic.h"
|
||||
#include "clang/Basic/TargetInfo.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
using namespace clang;
|
||||
|
||||
@@ -547,6 +548,26 @@ unsigned AsmStmt::AnalyzeAsmString(SmallVectorImpl<AsmStringPiece>&Pieces,
|
||||
return diag::err_asm_invalid_escape;
|
||||
}
|
||||
}
|
||||
/// GenerateAsmString - Assemble final asm string.
|
||||
std::string AsmStmt::GenerateAsmString(ASTContext &C) const {
|
||||
// Analyze the asm string to decompose it into its pieces. We know that Sema
|
||||
// has already done this, so it is guaranteed to be successful.
|
||||
SmallVector<AsmStmt::AsmStringPiece, 4> Pieces;
|
||||
unsigned DiagOffs;
|
||||
AnalyzeAsmString(Pieces, C, DiagOffs);
|
||||
|
||||
std::string AsmString;
|
||||
for (unsigned i = 0, e = Pieces.size(); i != e; ++i) {
|
||||
if (Pieces[i].isString())
|
||||
AsmString += Pieces[i].getString();
|
||||
else if (Pieces[i].getModifier() == '\0')
|
||||
AsmString += '$' + llvm::utostr(Pieces[i].getOperandNo());
|
||||
else
|
||||
AsmString += "${" + llvm::utostr(Pieces[i].getOperandNo()) + ':' +
|
||||
Pieces[i].getModifier() + '}';
|
||||
}
|
||||
return AsmString;
|
||||
}
|
||||
|
||||
Expr *MSAsmStmt::getOutputExpr(unsigned i) {
|
||||
return cast<Expr>(Exprs[i]);
|
||||
|
||||
@@ -1395,23 +1395,8 @@ static llvm::MDNode *getAsmSrcLocInfo(const StringLiteral *Str,
|
||||
}
|
||||
|
||||
void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
|
||||
// Analyze the asm string to decompose it into its pieces. We know that Sema
|
||||
// has already done this, so it is guaranteed to be successful.
|
||||
SmallVector<AsmStmt::AsmStringPiece, 4> Pieces;
|
||||
unsigned DiagOffs;
|
||||
S.AnalyzeAsmString(Pieces, getContext(), DiagOffs);
|
||||
|
||||
// Assemble the pieces into the final asm string.
|
||||
std::string AsmString;
|
||||
for (unsigned i = 0, e = Pieces.size(); i != e; ++i) {
|
||||
if (Pieces[i].isString())
|
||||
AsmString += Pieces[i].getString();
|
||||
else if (Pieces[i].getModifier() == '\0')
|
||||
AsmString += '$' + llvm::utostr(Pieces[i].getOperandNo());
|
||||
else
|
||||
AsmString += "${" + llvm::utostr(Pieces[i].getOperandNo()) + ':' +
|
||||
Pieces[i].getModifier() + '}';
|
||||
}
|
||||
// Assemble the final asm string.
|
||||
std::string AsmString = S.GenerateAsmString(getContext());
|
||||
|
||||
// Get all the output and input constraints together.
|
||||
SmallVector<TargetInfo::ConstraintInfo, 4> OutputConstraintInfos;
|
||||
|
||||
Reference in New Issue
Block a user