mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
[ms-inline asm] Add support for the nsdialect keyword in the Bitcode
Reader/Writer. llvm-svn: 163185
This commit is contained in:
parent
aaab764144
commit
00a82f13af
@ -161,11 +161,14 @@ namespace bitc {
|
||||
CST_CODE_CE_INSERTELT = 15, // CE_INSERTELT: [opval, opval, opval]
|
||||
CST_CODE_CE_SHUFFLEVEC = 16, // CE_SHUFFLEVEC: [opval, opval, opval]
|
||||
CST_CODE_CE_CMP = 17, // CE_CMP: [opty, opval, opval, pred]
|
||||
CST_CODE_INLINEASM = 18, // INLINEASM: [sideeffect,asmstr,conststr]
|
||||
CST_CODE_INLINEASM_OLD = 18, // INLINEASM: [sideeffect|alignstack,
|
||||
// asmstr,conststr]
|
||||
CST_CODE_CE_SHUFVEC_EX = 19, // SHUFVEC_EX: [opty, opval, opval, opval]
|
||||
CST_CODE_CE_INBOUNDS_GEP = 20,// INBOUNDS_GEP: [n x operands]
|
||||
CST_CODE_BLOCKADDRESS = 21, // CST_CODE_BLOCKADDRESS [fnty, fnval, bb#]
|
||||
CST_CODE_DATA = 22 // DATA: [n x elements]
|
||||
CST_CODE_DATA = 22, // DATA: [n x elements]
|
||||
CST_CODE_INLINEASM = 23 // INLINEASM: [sideeffect|alignstack|
|
||||
// nsdialect,asmstr,conststr]
|
||||
};
|
||||
|
||||
/// CastOpcodes - These are values used in the bitcode files to encode which
|
||||
|
@ -1245,7 +1245,8 @@ bool BitcodeReader::ParseConstants() {
|
||||
V = ConstantExpr::getICmp(Record[3], Op0, Op1);
|
||||
break;
|
||||
}
|
||||
case bitc::CST_CODE_INLINEASM: {
|
||||
// This maintains backward compatibility, pre-'nsdialect'.
|
||||
case bitc::CST_CODE_INLINEASM_OLD: {
|
||||
if (Record.size() < 2) return Error("Invalid INLINEASM record");
|
||||
std::string AsmStr, ConstrStr;
|
||||
bool HasSideEffects = Record[0] & 1;
|
||||
@ -1266,6 +1267,30 @@ bool BitcodeReader::ParseConstants() {
|
||||
AsmStr, ConstrStr, HasSideEffects, IsAlignStack);
|
||||
break;
|
||||
}
|
||||
// This version adds support for the 'nsdialect' keyword.
|
||||
case bitc::CST_CODE_INLINEASM: {
|
||||
if (Record.size() < 2) return Error("Invalid INLINEASM record");
|
||||
std::string AsmStr, ConstrStr;
|
||||
bool HasSideEffects = Record[0] & 1;
|
||||
bool IsAlignStack = (Record[0] >> 1) & 1;
|
||||
unsigned AsmDialect = Record[0] >> 2;
|
||||
unsigned AsmStrSize = Record[1];
|
||||
if (2+AsmStrSize >= Record.size())
|
||||
return Error("Invalid INLINEASM record");
|
||||
unsigned ConstStrSize = Record[2+AsmStrSize];
|
||||
if (3+AsmStrSize+ConstStrSize > Record.size())
|
||||
return Error("Invalid INLINEASM record");
|
||||
|
||||
for (unsigned i = 0; i != AsmStrSize; ++i)
|
||||
AsmStr += (char)Record[2+i];
|
||||
for (unsigned i = 0; i != ConstStrSize; ++i)
|
||||
ConstrStr += (char)Record[3+AsmStrSize+i];
|
||||
PointerType *PTy = cast<PointerType>(CurTy);
|
||||
V = InlineAsm::get(cast<FunctionType>(PTy->getElementType()),
|
||||
AsmStr, ConstrStr, HasSideEffects, IsAlignStack,
|
||||
AsmDialect);
|
||||
break;
|
||||
}
|
||||
case bitc::CST_CODE_BLOCKADDRESS:{
|
||||
if (Record.size() < 3) return Error("Invalid CE_BLOCKADDRESS record");
|
||||
Type *FnTy = getTypeByID(Record[0]);
|
||||
|
@ -814,7 +814,8 @@ static void WriteConstants(unsigned FirstVal, unsigned LastVal,
|
||||
|
||||
if (const InlineAsm *IA = dyn_cast<InlineAsm>(V)) {
|
||||
Record.push_back(unsigned(IA->hasSideEffects()) |
|
||||
unsigned(IA->isAlignStack()) << 1);
|
||||
unsigned(IA->isAlignStack()) << 1 |
|
||||
unsigned(IA->getDialect()&1) << 2);
|
||||
|
||||
// Add the asm string.
|
||||
const std::string &AsmStr = IA->getAsmString();
|
||||
|
Loading…
Reference in New Issue
Block a user