OLD | NEW |
---|---|
1 //===-- InlineAsm.cpp - Implement the InlineAsm class ---------------------===// | 1 //===-- InlineAsm.cpp - Implement the InlineAsm class ---------------------===// |
2 // | 2 // |
3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 // | 9 // |
10 // This file implements the InlineAsm class. | 10 // This file implements the InlineAsm class. |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
286 StructType *STy = dyn_cast<StructType>(Ty->getReturnType()); | 286 StructType *STy = dyn_cast<StructType>(Ty->getReturnType()); |
287 if (STy == 0 || STy->getNumElements() != NumOutputs) | 287 if (STy == 0 || STy->getNumElements() != NumOutputs) |
288 return false; | 288 return false; |
289 break; | 289 break; |
290 } | 290 } |
291 | 291 |
292 if (Ty->getNumParams() != NumInputs) return false; | 292 if (Ty->getNumParams() != NumInputs) return false; |
293 return true; | 293 return true; |
294 } | 294 } |
295 | 295 |
296 // @LOCALMOD-START | |
297 bool InlineAsm::isAsmMemory() const { | |
298 bool retVoid = getFunctionType()->getReturnType()->isVoidTy(); | |
299 bool noArgs = getFunctionType()->getNumParams() == 0 && | |
300 !getFunctionType()->isVarArg(); | |
301 bool isEmptyAsm = AsmString.empty(); | |
302 // Different triples will encode "touch everything" differently, e.g.: | |
303 // - le32-unknown-nacl has "~{memory}". | |
304 // - x86 "~{memory},~{dirflag},~{fpsr},~{flags}". | |
jvoung (off chromium)
2013/08/07 22:32:11
Does that mean that in the backend, we need to con
JF
2013/08/07 22:47:41
Kind of. It comes from Clang's TargetInfo getClobb
| |
305 // The following code therefore only searches for memory. | |
306 bool touchesMemory = Constraints.find("~{memory}") != std::string::npos; | |
307 | |
308 return retVoid && noArgs && hasSideEffects() && isEmptyAsm && touchesMemory; | |
309 } | |
310 // @LOCALMOD-END | |
OLD | NEW |