Author: johannes Date: Fri Dec 14 16:01:57 2007 New Revision: 45042 URL: http://llvm.org/viewvc/llvm-project?rev=45042&view=rev Log: Compensate for a representation change in register names between gcc4.0 and 4.2, thus making asm handling be only partially broken, as in 4.0.
Modified: llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp llvm-gcc-4.2/trunk/gcc/llvm.h Modified: llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp?rev=45042&r1=45041&r2=45042&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp (original) +++ llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp Fri Dec 14 16:01:57 2007 @@ -913,8 +913,7 @@ /// well-formed. If not, emit error messages and return true. If so, return /// false. bool ValidateRegisterVariable(tree decl) { - const char *Name = IDENTIFIER_POINTER(DECL_ASSEMBLER_NAME(decl)); - int RegNumber = decode_reg_name(Name); + int RegNumber = decode_reg_name(llvm_get_register_name(decl)); const Type *Ty = ConvertType(TREE_TYPE(decl)); // If this has already been processed, don't emit duplicate error messages. @@ -1246,4 +1245,12 @@ WriteTypeSymbolic(FS, (const Type*)LLVM, TheModule); } +// Get a register name given its decl. In 4.2 unlike 4.0 these names +// have been run through set_user_assembler_name which means they may +// have a leading \1 at this point; compensate. + +const char* llvm_get_register_name(tree decl) { + const char* Name = IDENTIFIER_POINTER(DECL_ASSEMBLER_NAME(decl)); + return (*Name==1) ? Name+1 : Name; +} /* LLVM LOCAL end (ENTIRE FILE!) */ 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=45042&r1=45041&r2=45042&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original) +++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Fri Dec 14 16:01:57 2007 @@ -3305,7 +3305,7 @@ // Turn this into a 'tmp = call Ty asm "", "={reg}"()'. FunctionType *FTy = FunctionType::get(Ty, std::vector<const Type*>(),false); - const char *Name = IDENTIFIER_POINTER(DECL_ASSEMBLER_NAME(decl)); + const char *Name = llvm_get_register_name(decl); InlineAsm *IA = InlineAsm::get(FTy, "", "={"+std::string(Name)+"}", false); return Builder.CreateCall(IA, "tmp"); } @@ -3322,7 +3322,7 @@ ArgTys.push_back(ConvertType(TREE_TYPE(decl))); FunctionType *FTy = FunctionType::get(Type::VoidTy, ArgTys, false); - const char *Name = IDENTIFIER_POINTER(DECL_ASSEMBLER_NAME(decl)); + const char *Name = llvm_get_register_name(decl); InlineAsm *IA = InlineAsm::get(FTy, "", "{"+std::string(Name)+"}", true); Builder.CreateCall(IA, RHS); } @@ -3571,8 +3571,7 @@ // If this output register is pinned to a machine register, use that machine // register instead of the specified constraint. if (TREE_CODE(Operand) == VAR_DECL && DECL_HARD_REGISTER(Operand)) { - int RegNum = - decode_reg_name(IDENTIFIER_POINTER(DECL_ASSEMBLER_NAME(Operand))); + int RegNum = decode_reg_name(llvm_get_register_name(Operand)); if (RegNum >= 0) { unsigned RegNameLen = strlen(reg_names[RegNum]); char *NewConstraint = (char*)alloca(RegNameLen+4); @@ -3684,8 +3683,7 @@ // register instead of the specified constraint. int RegNum; if (TREE_CODE(Val) == VAR_DECL && DECL_HARD_REGISTER(Val) && - (RegNum = - decode_reg_name(IDENTIFIER_POINTER(DECL_ASSEMBLER_NAME(Val)))) >= 0) { + (RegNum = decode_reg_name(llvm_get_register_name(Val))) >= 0) { ConstraintStr += '{'; ConstraintStr += reg_names[RegNum]; ConstraintStr += '}'; Modified: llvm-gcc-4.2/trunk/gcc/llvm.h URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm.h?rev=45042&r1=45041&r2=45042&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/llvm.h (original) +++ llvm-gcc-4.2/trunk/gcc/llvm.h Fri Dec 14 16:01:57 2007 @@ -106,6 +106,10 @@ */ void refine_type_to (union tree_node*, union tree_node*); +/* llvm_get_register_name - extract a register name from a decl in format + * pleasing to llvm. + */ +const char* llvm_get_register_name(union tree_node*); #endif /* ENABLE_LLVM */ #endif _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits