[llvm-commits] [llvm-gcc-4.2] r119392 - in /llvm-gcc-4.2/trunk/gcc: config/i386/i386.c llvm-convert.cpp tree.h
Dale Johannesen
dalej at apple.com
Tue Nov 16 13:55:09 PST 2010
Author: johannes
Date: Tue Nov 16 15:55:09 2010
New Revision: 119392
URL: http://llvm.org/viewvc/llvm-project?rev=119392&view=rev
Log:
My patch 112674 fixed the use of asm register variables,
but broke asm blocks. The fundamental problem is that the
asm-block handling code used register variables in ways that
are beyond what standard gcc register variables support, such
as expecting parameter registers to be defined at the entrance
to a function. To fix this, represent the use of registers
by asm blocks with a different, marked VAR_DECL than standard
gcc register variables, and generate pre-112674 IR (which
was correct in this case) for them. MMX register handling has
changed in the meantime, and is adjusted. 8482548.
Modified:
llvm-gcc-4.2/trunk/gcc/config/i386/i386.c
llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
llvm-gcc-4.2/trunk/gcc/tree.h
Modified: llvm-gcc-4.2/trunk/gcc/config/i386/i386.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/i386/i386.c?rev=119392&r1=119391&r2=119392&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/i386/i386.c (original)
+++ llvm-gcc-4.2/trunk/gcc/config/i386/i386.c Tue Nov 16 15:55:09 2010
@@ -22161,7 +22161,7 @@
decl = lookup_name (arg);
if (decl == error_mark_node)
decl = 0;
- if (decl == 0)
+ if (decl == 0 || !DECL_ASM_BLOCK_REGISTER (decl))
{
tree type = iasm_type_for (arg);
if (type)
@@ -22171,6 +22171,7 @@
DECL_REGISTER (decl) = 1;
C_DECL_REGISTER (decl) = 1;
DECL_HARD_REGISTER (decl) = 1;
+ DECL_ASM_BLOCK_REGISTER (decl) = 1;
set_user_assembler_name (decl, IDENTIFIER_POINTER (arg));
decl = lang_hooks.decls.pushdecl (decl);
}
Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=119392&r1=119391&r2=119392&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Tue Nov 16 15:55:09 2010
@@ -2457,6 +2457,10 @@
if (TREE_STATIC(exp) || DECL_EXTERNAL(exp) || TREE_PUBLIC(exp))
return false;
+ // Asm block register usage is not accepted here.
+ if (DECL_ASM_BLOCK_REGISTER (exp))
+ return false;
+
// Emit inline asm if this is local variable with assembler name on it.
if (DECL_ASSEMBLER_NAME_SET_P(exp))
return true;
@@ -2470,6 +2474,10 @@
if (TREE_CODE(exp) != VAR_DECL || !DECL_REGISTER(exp))
return false;
+ // Treat register usage in asm blocks as global.
+ if (DECL_ASM_BLOCK_REGISTER (exp))
+ return true;
+
// Local register variables are not accepted here.
if (TREE_STATIC(exp) || DECL_EXTERNAL(exp) || TREE_PUBLIC(exp))
return true;
@@ -4329,6 +4337,8 @@
Value *TreeToLLVM::EmitReadOfRegisterVariable(tree decl,
const MemRef *DestLoc) {
const Type *Ty = ConvertType(TREE_TYPE(decl));
+ if (LLVM_IS_DECL_MMX_REGISTER(decl))
+ Ty = Type::getX86_MMXTy(Context);
// If there was an error, return something bogus.
if (ValidateRegisterVariable(decl)) {
@@ -4394,7 +4404,10 @@
// Turn this into a 'call void asm sideeffect "", "{reg}"(Ty %RHS)'.
std::vector<const Type*> ArgTys;
- ArgTys.push_back(ConvertType(TREE_TYPE(decl)));
+ const Type* Ty = ConvertType(TREE_TYPE(decl));
+ if (LLVM_IS_DECL_MMX_REGISTER(decl))
+ Ty = Type::getX86_MMXTy(Context);
+ ArgTys.push_back(Ty);
FunctionType *FTy = FunctionType::get(Type::getVoidTy(Context), ArgTys, false);
const char *Name = extractRegisterName(decl);
Modified: llvm-gcc-4.2/trunk/gcc/tree.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/tree.h?rev=119392&r1=119391&r2=119392&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/tree.h (original)
+++ llvm-gcc-4.2/trunk/gcc/tree.h Tue Nov 16 15:55:09 2010
@@ -2623,6 +2623,8 @@
In VAR_DECL and PARM_DECL, this is DECL_REGISTER. */
unsigned decl_flag_0 : 1;
/* In FIELD_DECL, this is DECL_PACKED. */
+ /* LLVM LOCAL */
+ /* In VAR_DECL, this is DECL_ASM_BLOCK_REGISTER. */
unsigned decl_flag_1 : 1;
/* In FIELD_DECL, this is DECL_BIT_FIELD
In VAR_DECL and FUNCTION_DECL, this is DECL_EXTERNAL.
@@ -2703,6 +2705,9 @@
/* In VAR_DECL and PARM_DECL nodes, nonzero means declared `register'. */
#define DECL_REGISTER(NODE) (DECL_WRTL_CHECK (NODE)->decl_common.decl_flag_0)
+/* In VAR_DECL, nonzero means a register used by asm block code. */
+#define DECL_ASM_BLOCK_REGISTER(NODE) (DECL_WRTL_CHECK (NODE)->decl_common.decl_flag_1)
+
struct tree_decl_with_rtl GTY(())
{
struct tree_decl_common common;
More information about the llvm-commits
mailing list