mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	Operand of asm("call") (the callee function) is represented
as "X" constraint and "P" modifier on x86. Make this work. (Change may not be sufficient to fix it for non-Darwin, but I'm pretty sure it won't break anything.) gcc.apple/asm-block-32.c gcc.apple/asm-block-33.c git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74967 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		| @@ -2405,11 +2405,24 @@ void TargetLowering::ComputeConstraintToUse(AsmOperandInfo &OpInfo, | |||||||
|    |    | ||||||
|   // 'X' matches anything. |   // 'X' matches anything. | ||||||
|   if (OpInfo.ConstraintCode == "X" && OpInfo.CallOperandVal) { |   if (OpInfo.ConstraintCode == "X" && OpInfo.CallOperandVal) { | ||||||
|  |     // Look through bitcasts over functions.  In the context of an asm | ||||||
|  |     // argument we don't care about bitcasting function types; the parameters | ||||||
|  |     // to the function, if any, will have been handled elsewhere. | ||||||
|  |     Value *v = OpInfo.CallOperandVal; | ||||||
|  |     ConstantExpr *CE = NULL; | ||||||
|  |     while ((CE = dyn_cast<ConstantExpr>(v)) && | ||||||
|  |            CE->getOpcode()==Instruction::BitCast) | ||||||
|  |       v = CE->getOperand(0); | ||||||
|  |     if (!isa<Function>(v)) | ||||||
|  |       v = OpInfo.CallOperandVal; | ||||||
|     // Labels and constants are handled elsewhere ('X' is the only thing |     // Labels and constants are handled elsewhere ('X' is the only thing | ||||||
|     // that matches labels). |     // that matches labels).  For Functions, the type here is the type of | ||||||
|     if (isa<BasicBlock>(OpInfo.CallOperandVal) || |     // the result, which is not what we want to look at; leave them alone | ||||||
|         isa<ConstantInt>(OpInfo.CallOperandVal)) |     // (minus any bitcasts). | ||||||
|  |     if (isa<BasicBlock>(v) || isa<ConstantInt>(v) || isa<Function>(v)) { | ||||||
|  |       OpInfo.CallOperandVal = v; | ||||||
|       return; |       return; | ||||||
|  |     } | ||||||
|      |      | ||||||
|     // Otherwise, try to resolve it to something we know about by looking at |     // Otherwise, try to resolve it to something we know about by looking at | ||||||
|     // the actual operand type. |     // the actual operand type. | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user