[llvm-branch-commits] [llvm-gcc-branch] r116106 - in /llvm-gcc-4.2/branches/Apple/Morbo/gcc: llvm-convert.cpp llvm-internal.h objc/objc-act.c
Stuart Hastings
stuart at apple.com
Fri Oct 8 14:27:40 PDT 2010
Author: stuart
Date: Fri Oct 8 16:27:39 2010
New Revision: 116106
URL: http://llvm.org/viewvc/llvm-project?rev=116106&view=rev
Log:
Merge patches for Radars 8365393 6383121 8305081 into Morbo.
Modified:
llvm-gcc-4.2/branches/Apple/Morbo/gcc/llvm-convert.cpp
llvm-gcc-4.2/branches/Apple/Morbo/gcc/llvm-internal.h
llvm-gcc-4.2/branches/Apple/Morbo/gcc/objc/objc-act.c
Modified: llvm-gcc-4.2/branches/Apple/Morbo/gcc/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/branches/Apple/Morbo/gcc/llvm-convert.cpp?rev=116106&r1=116105&r2=116106&view=diff
==============================================================================
--- llvm-gcc-4.2/branches/Apple/Morbo/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/branches/Apple/Morbo/gcc/llvm-convert.cpp Fri Oct 8 16:27:39 2010
@@ -2410,14 +2410,14 @@
// ... Expressions ...
//===----------------------------------------------------------------------===//
-static bool canEmitRegisterVariable(tree exp) {
+static bool canEmitLocalRegisterVariable(tree exp) {
// Only variables can be marked as 'register'.
if (TREE_CODE(exp) != VAR_DECL || !DECL_REGISTER(exp))
return false;
- // We can emit inline assembler for access to global register variables.
+ // Global register variables are not accepted here.
if (TREE_STATIC(exp) || DECL_EXTERNAL(exp) || TREE_PUBLIC(exp))
- return true;
+ return false;
// Emit inline asm if this is local variable with assembler name on it.
if (DECL_ASSEMBLER_NAME_SET_P(exp))
@@ -2427,6 +2427,19 @@
return false;
}
+static bool canEmitGlobalRegisterVariable(tree exp) {
+ // Only variables can be marked as 'register'.
+ if (TREE_CODE(exp) != VAR_DECL || !DECL_REGISTER(exp))
+ return false;
+
+ // Local register variables are not accepted here.
+ if (TREE_STATIC(exp) || DECL_EXTERNAL(exp) || TREE_PUBLIC(exp))
+ return true;
+
+ // Otherwise - it's normal automatic variable, or local register variable.
+ return false;
+}
+
/// EmitLoadOfLValue - When an l-value expression is used in a context that
/// requires an r-value, this method emits the lvalue computation, then loads
@@ -2444,10 +2457,10 @@
DECL_GIMPLE_FORMAL_TEMP_P(exp) = 0;
EmitAutomaticVariableDecl(exp);
// Fall through.
- } else if (canEmitRegisterVariable(exp)) {
- // If this is a register variable, EmitLV can't handle it (there is no
- // l-value of a register variable). Emit an inline asm node that copies the
- // value out of the specified register.
+ } else if (canEmitGlobalRegisterVariable(exp)) {
+ // If this is a global register variable, EmitLV can't handle it (there is
+ // no l-value of a global register variable). Emit an inline asm node that
+ // copies the value out of the specified register.
return EmitReadOfRegisterVariable(exp, DestLoc);
}
@@ -2469,7 +2482,11 @@
Value *Ptr = BitCastToType(LV.Ptr, Ty->getPointerTo());
LoadInst *LI = Builder.CreateLoad(Ptr, isVolatile);
LI->setAlignment(Alignment);
- return LI;
+ if (canEmitLocalRegisterVariable(exp)) {
+ // For register variable, move the loaded variable into the right reg.
+ return EmitMoveOfRegVariableToRightReg(LI, exp);
+ } else
+ return LI;
} else {
EmitAggregateCopy(*DestLoc, MemRef(LV.Ptr, Alignment, isVolatile),
TREE_TYPE(exp));
@@ -3255,10 +3272,10 @@
Builder.Insert(Cast);
SET_DECL_LLVM(lhs, Cast);
return Cast;
- } else if (canEmitRegisterVariable(lhs)) {
- // If this is a store to a register variable, EmitLV can't handle the dest
- // (there is no l-value of a register variable). Emit an inline asm node
- // that copies the value into the specified register.
+ } else if (canEmitGlobalRegisterVariable(lhs)) {
+ // If this is a store to a global register variable, EmitLV can't handle the
+ // dest (there is no l-value of a global register variable). Emit an inline
+ // asm node that copies the value into the specified register.
Value *RHS = Emit(rhs, 0);
RHS = CastToAnyType(RHS, RHSSigned, ConvertType(TREE_TYPE(lhs)), LHSSigned);
EmitModifyOfRegisterVariable(lhs, RHS);
@@ -4187,8 +4204,8 @@
#define LLVM_GET_REG_NAME(REG_NAME, REG_NUM) reg_names[REG_NUM]
#endif
-/// Reads from register variables are handled by emitting an inline asm node
-/// that copies the value out of the specified register.
+ /// Reads from global register variables are handled by emitting an inline
+ /// asm node that copies the value out of the specified register.
Value *TreeToLLVM::EmitReadOfRegisterVariable(tree decl,
const MemRef *DestLoc) {
const Type *Ty = ConvertType(TREE_TYPE(decl));
@@ -4213,8 +4230,43 @@
return Call;
}
-/// Stores to register variables are handled by emitting an inline asm node
-/// that copies the value into the specified register.
+/// Reads from register variables are handled by emitting an inline asm node
+/// that copies the value out of the specified register.
+Value *TreeToLLVM::EmitMoveOfRegVariableToRightReg(Instruction *I, tree var) {
+ // Create a 'call void asm sideeffect "", "{reg}"(Ty %RHS)'.
+ const Type *Ty = I->getType();
+
+ // If there was an error, return something bogus.
+ if (ValidateRegisterVariable(var)) {
+ if (Ty->isSingleValueType())
+ return UndefValue::get(Ty);
+ return 0; // Just don't copy something into DestLoc.
+ }
+
+ std::vector<const Type*> ArgTys;
+ ArgTys.push_back(Ty);
+ FunctionType *FTy = FunctionType::get(Type::getVoidTy(Context),
+ ArgTys, false);
+ const char *Name = extractRegisterName(var);
+ int RegNum = decode_reg_name(Name);
+ Name = LLVM_GET_REG_NAME(Name, RegNum);
+ InlineAsm *IA = InlineAsm::get(FTy, "", "{"+std::string(Name)+"}",
+ true);
+ CallInst *Call = Builder.CreateCall(IA, I);
+ Call->setDoesNotThrow();
+ // Create another asm with the same reg, this time producing an output.
+ // Turn this into a 'tmp = call Ty asm "", "={reg}"()'.
+ FunctionType *FTy2 = FunctionType::get(Ty, std::vector<const Type*>(),
+ false);
+ InlineAsm *IA2 = InlineAsm::get(FTy2, "", "={"+std::string(Name)+"}",
+ true);
+ CallInst *Call2 = Builder.CreateCall(IA2);
+ Call2->setDoesNotThrow();
+ return Call2;
+}
+
+/// Stores to global register variables are handled by emitting an inline asm
+/// node that copies the value into the specified register.
void TreeToLLVM::EmitModifyOfRegisterVariable(tree decl, Value *RHS) {
// If there was an error, bail out.
if (ValidateRegisterVariable(decl))
Modified: llvm-gcc-4.2/branches/Apple/Morbo/gcc/llvm-internal.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/branches/Apple/Morbo/gcc/llvm-internal.h?rev=116106&r1=116105&r2=116106&view=diff
==============================================================================
--- llvm-gcc-4.2/branches/Apple/Morbo/gcc/llvm-internal.h (original)
+++ llvm-gcc-4.2/branches/Apple/Morbo/gcc/llvm-internal.h Fri Oct 8 16:27:39 2010
@@ -526,6 +526,7 @@
Value *EmitASM_EXPR(tree_node *exp);
Value *EmitReadOfRegisterVariable(tree_node *vardecl, const MemRef *DestLoc);
void EmitModifyOfRegisterVariable(tree_node *vardecl, Value *RHS);
+ Value *EmitMoveOfRegVariableToRightReg(Instruction *I, tree_node *decl);
// Helpers for Builtin Function Expansion.
void EmitMemoryBarrier(bool ll, bool ls, bool sl, bool ss, bool device);
Modified: llvm-gcc-4.2/branches/Apple/Morbo/gcc/objc/objc-act.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/branches/Apple/Morbo/gcc/objc/objc-act.c?rev=116106&r1=116105&r2=116106&view=diff
==============================================================================
--- llvm-gcc-4.2/branches/Apple/Morbo/gcc/objc/objc-act.c (original)
+++ llvm-gcc-4.2/branches/Apple/Morbo/gcc/objc/objc-act.c Fri Oct 8 16:27:39 2010
@@ -15407,7 +15407,13 @@
is_ivar (tree decl_chain, tree ident)
{
for ( ; decl_chain; decl_chain = TREE_CHAIN (decl_chain))
- if (DECL_NAME (decl_chain) == ident)
+/* APPLE LOCAL begin radar 6383121 */
+ if (DECL_NAME (decl_chain) == ident
+#ifdef OBJCPLUS
+ && TREE_CODE (decl_chain) != TYPE_DECL
+#endif
+ )
+/* APPLE LOCAL end radar 6383121 */
return decl_chain;
return NULL_TREE;
}
@@ -19666,6 +19672,13 @@
/* Look up the ivar, but do not use it if it is not accessible. */
ivar = is_ivar (objc_ivar_chain, id);
+ /* APPLE LOCAL begin radar 6383121 */
+ if (!ivar && objc_implementation_context) {
+ tree class = lookup_interface (CLASS_NAME (objc_implementation_context));
+ if (class)
+ ivar = nested_ivar_lookup(class, id);
+ }
+ /* APPLE LOCAL end radar 6383121 */
if (!ivar || is_private (ivar))
return other;
More information about the llvm-branch-commits
mailing list