Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Change native format to Microsoft style #1544

Merged
merged 2 commits into from
Jun 17, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions .clang-format
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
---
# We'll use defaults from the LLVM style, but with 4 columns indentation.
BasedOnStyle: Google
BasedOnStyle: Microsoft
BreakBeforeBraces: WebKit
PointerAlignment: Left
ColumnLimit: '120'
1,954 changes: 946 additions & 1,008 deletions src/Datadog.Trace.ClrProfiler.Native/calltarget_tokens.cpp

Large diffs are not rendered by default.

220 changes: 102 additions & 118 deletions src/Datadog.Trace.ClrProfiler.Native/calltarget_tokens.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
#include "com_ptr.h"
#include "il_rewriter.h"
#include "integration.h"
#include "string.h" // NOLINT
#include "string.h" // NOLINT

#define FASTPATH_COUNT 9

Expand All @@ -22,124 +22,108 @@ namespace trace {
/// Also provides useful helpers for the rewriting process
/// </summary>
class CallTargetTokens {
private:
void* module_metadata_ptr = nullptr;

// CallTarget constants
WSTRING managed_profiler_calltarget_type = WStr("Datadog.Trace.ClrProfiler.CallTarget.CallTargetInvoker");
WSTRING managed_profiler_calltarget_beginmethod_name = WStr("BeginMethod");
WSTRING managed_profiler_calltarget_endmethod_name = WStr("EndMethod");
WSTRING managed_profiler_calltarget_logexception_name = WStr("LogException");
WSTRING managed_profiler_calltarget_getdefaultvalue_name = WStr("GetDefaultValue");

WSTRING managed_profiler_calltarget_statetype = WStr("Datadog.Trace.ClrProfiler.CallTarget.CallTargetState");
WSTRING managed_profiler_calltarget_statetype_getdefault_name =WStr("GetDefault");

WSTRING managed_profiler_calltarget_returntype = WStr("Datadog.Trace.ClrProfiler.CallTarget.CallTargetReturn");
WSTRING managed_profiler_calltarget_returntype_getdefault_name = WStr("GetDefault");

WSTRING managed_profiler_calltarget_returntype_generics = WStr("Datadog.Trace.ClrProfiler.CallTarget.CallTargetReturn`1");
WSTRING managed_profiler_calltarget_returntype_getreturnvalue_name = WStr("GetReturnValue");

// CorLib tokens
mdAssemblyRef corLibAssemblyRef = mdAssemblyRefNil;
mdTypeRef objectTypeRef = mdTypeRefNil;
mdTypeRef exTypeRef = mdTypeRefNil;
mdTypeRef typeRef = mdTypeRefNil;
mdTypeRef runtimeTypeHandleRef = mdTypeRefNil;
mdToken getTypeFromHandleToken = mdTokenNil;
mdTypeRef runtimeMethodHandleRef = mdTypeRefNil;

// CallTarget tokens
mdAssemblyRef profilerAssemblyRef = mdAssemblyRefNil;
mdTypeRef callTargetTypeRef = mdTypeRefNil;
mdTypeRef callTargetStateTypeRef = mdTypeRefNil;
mdTypeRef callTargetReturnVoidTypeRef = mdTypeRefNil;
mdTypeRef callTargetReturnTypeRef = mdTypeRefNil;

mdMemberRef beginArrayMemberRef = mdMemberRefNil;
mdMemberRef beginMethodFastPathRefs[FASTPATH_COUNT];
mdMemberRef endVoidMemberRef = mdMemberRefNil;

mdMemberRef logExceptionRef = mdMemberRefNil;

mdMemberRef callTargetStateTypeGetDefault = mdMemberRefNil;
mdMemberRef callTargetReturnVoidTypeGetDefault = mdMemberRefNil;
mdMemberRef getDefaultMemberRef = mdMemberRefNil;

inline ModuleMetadata* GetMetadata() {
return (ModuleMetadata*)module_metadata_ptr;
}
HRESULT EnsureCorLibTokens();
HRESULT EnsureBaseCalltargetTokens();
mdTypeRef GetTargetStateTypeRef();
mdTypeRef GetTargetVoidReturnTypeRef();
mdTypeSpec GetTargetReturnValueTypeRef(
FunctionMethodArgument* returnArgument);
mdMemberRef GetCallTargetStateDefaultMemberRef();
mdMemberRef GetCallTargetReturnVoidDefaultMemberRef();
mdMemberRef GetCallTargetReturnValueDefaultMemberRef(
mdTypeSpec callTargetReturnTypeSpec);
mdMethodSpec GetCallTargetDefaultValueMethodSpec(
FunctionMethodArgument* methodArgument);
mdToken GetCurrentTypeRef(const TypeInfo* currentType, bool& isValueType);

HRESULT ModifyLocalSig(ILRewriter* reWriter,
FunctionMethodArgument* methodReturnValue,
ULONG* callTargetStateIndex, ULONG* exceptionIndex,
ULONG* callTargetReturnIndex, ULONG* returnValueIndex,
mdToken* callTargetStateToken, mdToken* exceptionToken,
mdToken* callTargetReturnToken);

HRESULT WriteBeginMethodWithArgumentsArray(void* rewriterWrapperPtr,
mdTypeRef integrationTypeRef,
const TypeInfo* currentType,
ILInstr** instruction);

public:
CallTargetTokens(void* module_metadata_ptr) {
this->module_metadata_ptr = module_metadata_ptr;
for (int i = 0; i < FASTPATH_COUNT; i++) {
beginMethodFastPathRefs[i] = mdMemberRefNil;
private:
void* module_metadata_ptr = nullptr;

// CallTarget constants
WSTRING managed_profiler_calltarget_type = WStr("Datadog.Trace.ClrProfiler.CallTarget.CallTargetInvoker");
WSTRING managed_profiler_calltarget_beginmethod_name = WStr("BeginMethod");
WSTRING managed_profiler_calltarget_endmethod_name = WStr("EndMethod");
WSTRING managed_profiler_calltarget_logexception_name = WStr("LogException");
WSTRING managed_profiler_calltarget_getdefaultvalue_name = WStr("GetDefaultValue");

WSTRING managed_profiler_calltarget_statetype = WStr("Datadog.Trace.ClrProfiler.CallTarget.CallTargetState");
WSTRING managed_profiler_calltarget_statetype_getdefault_name = WStr("GetDefault");

WSTRING managed_profiler_calltarget_returntype = WStr("Datadog.Trace.ClrProfiler.CallTarget.CallTargetReturn");
WSTRING managed_profiler_calltarget_returntype_getdefault_name = WStr("GetDefault");

WSTRING managed_profiler_calltarget_returntype_generics =
WStr("Datadog.Trace.ClrProfiler.CallTarget.CallTargetReturn`1");
WSTRING managed_profiler_calltarget_returntype_getreturnvalue_name = WStr("GetReturnValue");

// CorLib tokens
mdAssemblyRef corLibAssemblyRef = mdAssemblyRefNil;
mdTypeRef objectTypeRef = mdTypeRefNil;
mdTypeRef exTypeRef = mdTypeRefNil;
mdTypeRef typeRef = mdTypeRefNil;
mdTypeRef runtimeTypeHandleRef = mdTypeRefNil;
mdToken getTypeFromHandleToken = mdTokenNil;
mdTypeRef runtimeMethodHandleRef = mdTypeRefNil;

// CallTarget tokens
mdAssemblyRef profilerAssemblyRef = mdAssemblyRefNil;
mdTypeRef callTargetTypeRef = mdTypeRefNil;
mdTypeRef callTargetStateTypeRef = mdTypeRefNil;
mdTypeRef callTargetReturnVoidTypeRef = mdTypeRefNil;
mdTypeRef callTargetReturnTypeRef = mdTypeRefNil;

mdMemberRef beginArrayMemberRef = mdMemberRefNil;
mdMemberRef beginMethodFastPathRefs[FASTPATH_COUNT];
mdMemberRef endVoidMemberRef = mdMemberRefNil;

mdMemberRef logExceptionRef = mdMemberRefNil;

mdMemberRef callTargetStateTypeGetDefault = mdMemberRefNil;
mdMemberRef callTargetReturnVoidTypeGetDefault = mdMemberRefNil;
mdMemberRef getDefaultMemberRef = mdMemberRefNil;

inline ModuleMetadata* GetMetadata()
{
return (ModuleMetadata*)module_metadata_ptr;
}
}
mdTypeRef GetObjectTypeRef();
mdTypeRef GetExceptionTypeRef();
mdAssemblyRef GetCorLibAssemblyRef();

HRESULT ModifyLocalSigAndInitialize(
void* rewriterWrapperPtr, FunctionInfo* functionInfo,
ULONG* callTargetStateIndex, ULONG* exceptionIndex,
ULONG* callTargetReturnIndex, ULONG* returnValueIndex,
mdToken* callTargetStateToken, mdToken* exceptionToken,
mdToken* callTargetReturnToken, ILInstr** firstInstruction);

HRESULT WriteBeginMethod(void* rewriterWrapperPtr,
mdTypeRef integrationTypeRef,
const TypeInfo* currentType,
std::vector<FunctionMethodArgument> &methodArguments,
ILInstr** instruction);

HRESULT WriteEndVoidReturnMemberRef(void* rewriterWrapperPtr,
mdTypeRef integrationTypeRef,
const TypeInfo* currentType,
ILInstr** instruction);

HRESULT WriteEndReturnMemberRef(void* rewriterWrapperPtr,
mdTypeRef integrationTypeRef,
const TypeInfo* currentType,
FunctionMethodArgument* returnArgument,
ILInstr** instruction);

HRESULT WriteLogException(void* rewriterWrapperPtr,
mdTypeRef integrationTypeRef,
const TypeInfo* currentType, ILInstr** instruction);

HRESULT WriteCallTargetReturnGetReturnValue(
void* rewriterWrapperPtr, mdTypeSpec callTargetReturnTypeSpec,
ILInstr** instruction);
HRESULT EnsureCorLibTokens();
HRESULT EnsureBaseCalltargetTokens();
mdTypeRef GetTargetStateTypeRef();
mdTypeRef GetTargetVoidReturnTypeRef();
mdTypeSpec GetTargetReturnValueTypeRef(FunctionMethodArgument* returnArgument);
mdMemberRef GetCallTargetStateDefaultMemberRef();
mdMemberRef GetCallTargetReturnVoidDefaultMemberRef();
mdMemberRef GetCallTargetReturnValueDefaultMemberRef(mdTypeSpec callTargetReturnTypeSpec);
mdMethodSpec GetCallTargetDefaultValueMethodSpec(FunctionMethodArgument* methodArgument);
mdToken GetCurrentTypeRef(const TypeInfo* currentType, bool& isValueType);

HRESULT ModifyLocalSig(ILRewriter* reWriter, FunctionMethodArgument* methodReturnValue, ULONG* callTargetStateIndex,
ULONG* exceptionIndex, ULONG* callTargetReturnIndex, ULONG* returnValueIndex,
mdToken* callTargetStateToken, mdToken* exceptionToken, mdToken* callTargetReturnToken);

HRESULT WriteBeginMethodWithArgumentsArray(void* rewriterWrapperPtr, mdTypeRef integrationTypeRef,
const TypeInfo* currentType, ILInstr** instruction);

public:
CallTargetTokens(void* module_metadata_ptr)
{
this->module_metadata_ptr = module_metadata_ptr;
for (int i = 0; i < FASTPATH_COUNT; i++) {
beginMethodFastPathRefs[i] = mdMemberRefNil;
}
}
mdTypeRef GetObjectTypeRef();
mdTypeRef GetExceptionTypeRef();
mdAssemblyRef GetCorLibAssemblyRef();

HRESULT ModifyLocalSigAndInitialize(void* rewriterWrapperPtr, FunctionInfo* functionInfo,
ULONG* callTargetStateIndex, ULONG* exceptionIndex,
ULONG* callTargetReturnIndex, ULONG* returnValueIndex,
mdToken* callTargetStateToken, mdToken* exceptionToken,
mdToken* callTargetReturnToken, ILInstr** firstInstruction);

HRESULT WriteBeginMethod(void* rewriterWrapperPtr, mdTypeRef integrationTypeRef, const TypeInfo* currentType,
std::vector<FunctionMethodArgument>& methodArguments, ILInstr** instruction);

HRESULT WriteEndVoidReturnMemberRef(void* rewriterWrapperPtr, mdTypeRef integrationTypeRef,
const TypeInfo* currentType, ILInstr** instruction);

HRESULT WriteEndReturnMemberRef(void* rewriterWrapperPtr, mdTypeRef integrationTypeRef, const TypeInfo* currentType,
FunctionMethodArgument* returnArgument, ILInstr** instruction);

HRESULT WriteLogException(void* rewriterWrapperPtr, mdTypeRef integrationTypeRef, const TypeInfo* currentType,
ILInstr** instruction);

HRESULT WriteCallTargetReturnGetReturnValue(void* rewriterWrapperPtr, mdTypeSpec callTargetReturnTypeSpec,
ILInstr** instruction);
};

} // namespace trace
} // namespace trace

#endif // DD_CLR_PROFILER_CALLTARGET_TOKENS_H_
#endif // DD_CLR_PROFILER_CALLTARGET_TOKENS_H_
90 changes: 50 additions & 40 deletions src/Datadog.Trace.ClrProfiler.Native/class_factory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,69 +7,79 @@
#include "logging.h"
#include "version.h"

ClassFactory::ClassFactory() : refCount(0) {}
ClassFactory::ClassFactory() : refCount(0)
{
}

ClassFactory::~ClassFactory() {}
ClassFactory::~ClassFactory()
{
}

HRESULT STDMETHODCALLTYPE ClassFactory::QueryInterface(REFIID riid,
void** ppvObject) {
if (riid == IID_IUnknown || riid == IID_IClassFactory) {
*ppvObject = this;
this->AddRef();
return S_OK;
}
HRESULT STDMETHODCALLTYPE ClassFactory::QueryInterface(REFIID riid, void** ppvObject)
{
if (riid == IID_IUnknown || riid == IID_IClassFactory) {
*ppvObject = this;
this->AddRef();
return S_OK;
}

*ppvObject = nullptr;
return E_NOINTERFACE;
*ppvObject = nullptr;
return E_NOINTERFACE;
}

ULONG STDMETHODCALLTYPE ClassFactory::AddRef() {
return std::atomic_fetch_add(&this->refCount, 1) + 1;
ULONG STDMETHODCALLTYPE ClassFactory::AddRef()
{
return std::atomic_fetch_add(&this->refCount, 1) + 1;
}

ULONG STDMETHODCALLTYPE ClassFactory::Release() {
int count = std::atomic_fetch_sub(&this->refCount, 1) - 1;
if (count <= 0) {
delete this;
}
ULONG STDMETHODCALLTYPE ClassFactory::Release()
{
int count = std::atomic_fetch_sub(&this->refCount, 1) - 1;
if (count <= 0) {
delete this;
}

return count;
return count;
}

// profiler entry point
HRESULT STDMETHODCALLTYPE ClassFactory::CreateInstance(IUnknown* pUnkOuter,
REFIID riid,
void** ppvObject) {
if (pUnkOuter != nullptr) {
*ppvObject = nullptr;
return CLASS_E_NOAGGREGATION;
}
HRESULT STDMETHODCALLTYPE ClassFactory::CreateInstance(IUnknown* pUnkOuter, REFIID riid, void** ppvObject)
{
if (pUnkOuter != nullptr) {
*ppvObject = nullptr;
return CLASS_E_NOAGGREGATION;
}

trace::Info("Datadog CLR Profiler ", PROFILER_VERSION,
" on",
trace::Info("Datadog CLR Profiler ", PROFILER_VERSION, " on",

#ifdef _WIN32
" Windows"
" Windows"
#elif MACOS
" macOS"
" macOS"
#else
" Linux"
" Linux"
#endif

#ifdef AMD64
, " (amd64)"
,
" (amd64)"
#elif X86
, " (x86)"
,
" (x86)"
#elif ARM64
, " (arm64)"
,
" (arm64)"
#elif ARM
, " (arm)"
, " (arm)"
#endif
);
trace::Debug("ClassFactory::CreateInstance");
);
trace::Debug("ClassFactory::CreateInstance");

auto profiler = new trace::CorProfiler();
return profiler->QueryInterface(riid, ppvObject);
auto profiler = new trace::CorProfiler();
return profiler->QueryInterface(riid, ppvObject);
}

HRESULT STDMETHODCALLTYPE ClassFactory::LockServer(BOOL fLock) { return S_OK; }
HRESULT STDMETHODCALLTYPE ClassFactory::LockServer(BOOL fLock)
{
return S_OK;
}
Loading