// get value object specialized to work with llvm IR types lldb::ValueObjectSP ABISysV_hexagon::GetReturnValueObjectImpl( lldb_private::Thread &thread, llvm::Type &retType ) const { Value value; ValueObjectSP vObjSP; // get the current register context RegisterContext *reg_ctx = thread.GetRegisterContext().get(); if (!reg_ctx) return vObjSP; // for now just pop R0 to find the return value const lldb_private::RegisterInfo *r0_info = reg_ctx->GetRegisterInfoAtIndex( 0 ); if ( r0_info == nullptr ) return vObjSP; // void return type if ( retType.isVoidTy( ) ) { value.GetScalar( ) = 0; } // integer / pointer return type else if ( retType.isIntegerTy( ) || retType.isPointerTy( ) ) { // read r0 register value lldb_private::RegisterValue r0_value; if ( !reg_ctx->ReadRegister( r0_info, r0_value ) ) return vObjSP; // push r0 into value uint32_t r0_u32 = r0_value.GetAsUInt32( ); // account for integer size if ( retType.isIntegerTy() && retType.isSized() ) { uint64_t size = retType.getScalarSizeInBits( ); uint64_t mask = ( 1ull << size ) - 1; // mask out higher order bits then the type we expect r0_u32 &= mask; } value.GetScalar( ) = r0_u32; } // unsupported return type else return vObjSP; // pack the value into a ValueObjectSP vObjSP = ValueObjectConstResult::Create ( thread.GetStackFrameAtIndex(0).get(), value, ConstString("") ); return vObjSP; }
DataType llvm_type_to_nts_type ( const llvm::Type & t ) { if ( t.isIntegerTy() ) { auto & it = llvm::cast<llvm::IntegerType> ( t ); return DataType ( ScalarType::BitVector ( it.getBitWidth() ) ); } /*else if ( t.isPointerTy() ) { return nts::DataType::BitVector ( 64 ); // 64 bit pointers } */ else { throw std::logic_error ( "Only integer types are supported" ); } }