568 changes: 568 additions & 0 deletions lldb/source/Plugins/ABI/SysV-hexagon/ABISysV_hexagon.cpp

Large diffs are not rendered by default.

148 changes: 148 additions & 0 deletions lldb/source/Plugins/ABI/SysV-hexagon/ABISysV_hexagon.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
//===-- ABISysV_hexagon.h ----------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef liblldb_ABISysV_hexagon_h_
#define liblldb_ABISysV_hexagon_h_

// C Includes
// C++ Includes
// Other libraries and framework includes
// Project includes
#include "lldb/lldb-private.h"
#include "lldb/Target/ABI.h"

class ABISysV_hexagon :
public lldb_private::ABI
{
public:

~ABISysV_hexagon( void )
{
}

virtual size_t
GetRedZoneSize ( void ) const;

virtual bool
PrepareTrivialCall ( lldb_private::Thread &thread,
lldb::addr_t sp,
lldb::addr_t functionAddress,
lldb::addr_t returnAddress,
llvm::ArrayRef<lldb::addr_t> args ) const;

// special thread plan for GDB style non-jit function calls
virtual bool
PrepareTrivialCall ( lldb_private::Thread &thread,
lldb::addr_t sp,
lldb::addr_t functionAddress,
lldb::addr_t returnAddress,
llvm::Type &prototype,
llvm::ArrayRef<ABI::CallArgument> args ) const;

virtual bool
GetArgumentValues ( lldb_private::Thread &thread,
lldb_private::ValueList &values ) const;

virtual lldb_private::Error
SetReturnValueObject ( lldb::StackFrameSP &frame_sp,
lldb::ValueObjectSP &new_value );

protected:
lldb::ValueObjectSP
GetReturnValueObjectSimple ( lldb_private::Thread &thread,
lldb_private::ClangASTType &ast_type ) const;

public:
virtual lldb::ValueObjectSP
GetReturnValueObjectImpl ( lldb_private::Thread &thread,
lldb_private::ClangASTType &type ) const;

// specialized to work with llvm IR types
virtual lldb::ValueObjectSP
GetReturnValueObjectImpl ( lldb_private::Thread &thread, llvm::Type &type ) const;

virtual bool
CreateFunctionEntryUnwindPlan ( lldb_private::UnwindPlan &unwind_plan );

virtual bool
CreateDefaultUnwindPlan ( lldb_private::UnwindPlan &unwind_plan );

virtual bool
RegisterIsVolatile ( const lldb_private::RegisterInfo *reg_info );

virtual bool
StackUsesFrames ( void )
{
return true;
}

virtual bool
CallFrameAddressIsValid ( lldb::addr_t cfa )
{
// Make sure the stack call frame addresses are 8 byte aligned
if (cfa & 0x07)
return false; // Not 8 byte aligned
if (cfa == 0)
return false; // Zero is not a valid stack address
return true;
}

virtual bool
CodeAddressIsValid ( lldb::addr_t pc )
{
// We have a 64 bit address space, so anything is valid as opcodes
// aren't fixed width...
return true;
}

virtual bool
FunctionCallsChangeCFA ( void )
{
return true;
}

virtual const lldb_private::RegisterInfo *
GetRegisterInfoArray ( uint32_t &count );

//------------------------------------------------------------------
// Static Functions
//------------------------------------------------------------------
static void
Initialize ( void );

static void
Terminate ( void );

static lldb::ABISP
CreateInstance ( const lldb_private::ArchSpec &arch );

static lldb_private::ConstString
GetPluginNameStatic ( void );

//------------------------------------------------------------------
// PluginInterface protocol
//------------------------------------------------------------------
virtual lldb_private::ConstString
GetPluginName ( void );

virtual uint32_t
GetPluginVersion ( void );

protected:
void
CreateRegisterMapIfNeeded ( void );

bool
RegisterIsCalleeSaved (const lldb_private::RegisterInfo *reg_info);

private:
ABISysV_hexagon ( void ) : lldb_private::ABI() { } // Call CreateInstance instead.
};

#endif // liblldb_ABISysV_hexagon_h_
5 changes: 5 additions & 0 deletions lldb/source/Plugins/ABI/SysV-hexagon/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
set(LLVM_NO_RTTI 1)

add_lldb_library(lldbPluginABISysV_hexagon
ABISysV_hexagon.cpp
)
14 changes: 14 additions & 0 deletions lldb/source/Plugins/ABI/SysV-hexagon/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
##===- source/Plugins/ABI/SysV-hexagon/Makefile -------------*- Makefile -*-===##
#
# The LLVM Compiler Infrastructure
#
# This file is distributed under the University of Illinois Open Source
# License. See LICENSE.TXT for details.
#
##===----------------------------------------------------------------------===##

LLDB_LEVEL := ../../../..
LIBRARYNAME := lldbPluginABISysV_hexagon
BUILD_ARCHIVE = 1

include $(LLDB_LEVEL)/Makefile
34 changes: 33 additions & 1 deletion lldb/source/Target/ABI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ ABI::~ABI()
{
}


bool
ABI::GetRegisterInfoByName (const ConstString &name, RegisterInfo &info)
{
Expand Down Expand Up @@ -172,4 +171,37 @@ ABI::GetReturnValueObject (Thread &thread,
return return_valobj_sp;
}

ValueObjectSP
ABI::GetReturnValueObject(Thread &thread, llvm::Type &ast_type, bool persistent) const
{
ValueObjectSP return_valobj_sp;
return_valobj_sp = GetReturnValueObjectImpl( thread, ast_type );
return return_valobj_sp;
}

// specialized to work with llvm IR types
//
// for now we will specify a default implementation so that we don't need to
// modify other ABIs
lldb::ValueObjectSP
ABI::GetReturnValueObjectImpl( Thread &thread, llvm::Type &ir_type ) const
{
ValueObjectSP return_valobj_sp;

/* this is a dummy and will only be called if an ABI does not override this */

return return_valobj_sp;
}

bool
ABI::PrepareTrivialCall (Thread &thread,
lldb::addr_t sp,
lldb::addr_t functionAddress,
lldb::addr_t returnAddress,
llvm::Type &returntype,
llvm::ArrayRef<ABI::CallArgument> args) const
{
// dummy prepare trivial call
assert( !"Should never get here!" );
return false;
}