clang plug-in instrumentation of llvm source code and analysis of function call logs (2)–google mirror

tick_plot__compile.ipynb
clang plug-in instrumentation of llvm source code and analysis of function call logs (1)

Analysis

In and out, chain, out

df in and out=df[ df['tickKind'].isin( [FuncEnter,FuncReturn] ) ]


#In the code, only when the function enters, the chain length is calculated and written to the disk
dfin=df[ df['tickKind'].isin( [FuncEnter] ) ]
df chain=df in

# Function local duration application counter value when exiting
dfout=df[ df['tickKind'].isin( [FuncReturn] ) ]

Look up funcId dictionary from funcEnterId

fei2fi = df chain.set_index('funcEnterId')['funcId'].to_dict()
type(fei2fi), list(fei2fi.items())[0:10]
(dict,
 [(0, 725),
  (1, 576),
  (2, 355),
  (3, 2237),
  (4, 165),
  (5, 355),
  (6, 2237),
  (7, 165),
  (8, 355),
  (9, 2237)])
fei2fn = df chain.set_index('funcEnterId')['funcName'].to_dict()
type(fei2fn), list(fei2fn.items())[0:10]
(dict,
 [(0, 'llvm::cl::getGeneralCategory'),
  (1, 'llvm::cl::OptionCategory::registerCategory'),
  (2, 'llvm::ManagedStaticBase::RegisterManagedStatic'),
  (3, 'llvm::llvm_is_multithreaded'),
  (4, 'getManagedStaticMutex'),
  (5, 'llvm::ManagedStaticBase::RegisterManagedStatic'),
  (6, 'llvm::llvm_is_multithreaded'),
  (7, 'getManagedStaticMutex'),
  (8, 'llvm::ManagedStaticBase::RegisterManagedStatic'),
  (9, 'llvm::llvm_is_multithreaded')])

Construction field funcIdSeq

#Use the dictionary fei2fi to convert the input funcEnterIdSeqK into funcIdSeqK
def funcEnterIdSeq2funcIdSeq(funcEnterIdSeqK:str):
    fis=[]
    fiK=None
    for feiK_str in funcEnterIdSeqK.split("#"):
        if feiK_str == '':
            continue
        
        feiK=int(feiK_str) # feiK must be in digital format, if not, an error will be reported
        
        fiK=fei2fi[feiK] # feiK must be in the dictionary fei2fi, if not, an error will be reported
        
        fis.append(fiK)
    
    fiKStr_ls= [ f'{<!-- -->fiK}' for fiK in fis]
    
    return '#'.join(fiKStr_ls)

#Use the dictionary fei2fn to convert the input funcEnterIdSeqK into funcNameSeqK
def funcEnterIdSeq2funcNameSeq(funcEnterIdSeqK:str):
    fns=[]
    fnK=None
    for feiK_str in funcEnterIdSeqK.split("#"):
        if feiK_str == '':
            continue
        
        feiK=int(feiK_str) # feiK must be in digital format, if not, an error will be reported
        
        fnK=fei2fn[feiK] # feiK must be in the dictionary fei2fi, if not, an error will be reported
        
        fns.append(fnK)
    
    
    return '#'.join(fns)

#Test function funcEnterIdSeq2funcIdSeq
# funcEnterIdSeqK="#3#2#1#"
# funcEnterIdSeq2funcIdSeq(funcEnterIdSeqK),funcEnterIdSeq2funcNameSeq(funcEnterIdSeqK)
df in and out ['funcIdSeq']=df in and out ['funcEnterIdSeq'] .apply(lambda feisJ: funcEnterIdSeq2funcIdSeq(feisJ) )

dfin['funcIdSeq']=dfin['funcEnterIdSeq'] .apply(lambda feisJ: funcEnterIdSeq2funcIdSeq(feisJ) )
df chain=df in

dfout['funcIdSeq']=dfout['funcEnterIdSeq'] .apply(lambda feisJ: funcEnterIdSeq2funcIdSeq(feisJ) )
df in and out ['funcNameSeq']=df in and out ['funcEnterIdSeq'] .apply(lambda feisJ: funcEnterIdSeq2funcNameSeq(feisJ) )

dfIn['funcNameSeq']=dfIn['funcEnterIdSeq'] .apply(lambda feisJ: funcEnterIdSeq2funcNameSeq(feisJ) )
df chain=df in

dfout['funcNameSeq']=dfout['funcEnterIdSeq'] .apply(lambda feisJ: funcEnterIdSeq2funcNameSeq(feisJ) )

View

df in and out.shape, df chain.shape, df out.shape
#((666718, 26), (333359, 26), (333359, 26))
df in and out.head(5)

View 2

Function local duration grouping = dfout.groupby('funcLocalClock').size().reset_index(name='The number of outgoing durations')

Function local duration grouping_descending order = Function local duration grouping.sort_values(by='The number of outputs of this duration', ascending=False)
Function local duration group_descending.head(5)


3.4B Duration Boundary_Time On-Chain Variation

df=dfout

When top = df out ['funcLocalClock'].max()
Time bottom=dfout['funcLocalClock'].min()
print("Top of time, bottom of time", top of time, bottom of time)

Duration boundary_time chain anomaly_pairs=[]
for duration boundary k in range (time bottom, time top):
    Time upper function = df time [ df time ['funcLocalClock'].ge (duration boundary k) ] .funcId.unique()
    Time chain = df chain [ df chain ['funcId'].isin( time chain) ]
    Time chaining odd number = len(time chaining.funcIdSeq.unique()) #funcEnterIdSeq changed to funcIdSeq
    Duration boundary_time-on-chain anomaly_pairs.append((duration boundary k, time-on-chain anomaly))
    If the on-chain odd number <=1:
        break
    if duration boundary k % 800 == 0:
        print(f"Duration boundary k, time-on-chain exception: {<!-- -->Duration boundary k}, {<!-- -->time-on-chain exception}")







3.4 Calculate function IDs with short local duration



Long and short function call chain lists

['llvm::StringMapImpl::RehashTable',
 '',
 'llvm::StringMapImpl::RehashTable#llvm::PassRegistry::registerPass#LLVMInitializeX86Target',
 'llvm::StringMapImpl::RehashTable#llvm::PassRegistry::registerPass#llvm::initializeGlobalISel#LLVMInitializeX86Target',
 'llvm::StringMapImpl::RehashTable#llvm::PassRegistry::registerPass#llvm::initializeLazyBPIPassPass#llvm::initializeGlobalISel#LLVMInitializeX86Target',
 'llvm::opt::OptTable::OptTable#clang::driver::getDriverOptTable#clang::driver::getDriverMode',
 'llvm::StringMapImpl::RehashTable#llvm::opt::OptTable::OptTable#clang::driver::getDriverOptTable#clang::driver::getDriverMode',
 'llvm::opt::OptTable::addValues#clang::driver::getDriverOptTable#clang::driver::getDriverMode',
 'llvm::StringMapImpl::RehashTable#clang::driver::Driver::getToolChain#clang::driver::Driver::BuildCompilation',
 
#csdn blog cannot copy so many lines

'llvm::StringMapImpl::RehashTable#llvm::MCContext::createELFSectionImpl#llvm::MCContext::createELFRelSection#(anonymous namespace)::ELFWriter::createRelocationSection#(anonymous namespace)::ELFWriter::writeObject#llvm: :MCAssembler::Finish#llvm::MCObjectStreamer::finishImpl#llvm::MCELFStreamer::finishImpl#llvm::MCStreamer::finish#llvm::AsmPrinter::doFinalization#llvm::FPPassManager::doFinalization#(anonymous namespace) ::MPPassManager::runOnModule#(anonymous namespace)::EmitAssemblyHelper::RunCodegenPipeline#(anonymous namespace)::EmitAssemblyHelper::EmitAssembly#clang::EmitBackendOutput#clang::ParseAST#clang::ASTFrontendAction::ExecuteAction#clang:: CodeGenAction::ExecuteAction#clang::FrontendAction::Execute#clang::CompilerInstance::ExecuteAction#cc1_main#ExecuteCC1Tool#llvm::CrashRecoveryContext::RunSafely#clang::driver::CC1Command::Execute#clang::driver:: Compilation::ExecuteCommand#clang::driver::Compilation::ExecuteJobs#clang::driver::Driver::ExecuteCompilation',
 'llvm::StringMapImpl::RehashTable#llvm::MCContext::createELFSectionImpl#llvm::MCContext::getELFSection#llvm::MCContext::getELFSection#(anonymous namespace)::ELFWriter::computeSymbolTable#(anonymous namespace): :ELFWriter::writeObject#llvm::MCAssembler::Finish#llvm::MCObjectStreamer::finishImpl#llvm::MCELFStreamer::finishImpl#llvm::MCStreamer::finish#llvm::AsmPrinter::doFinalization#llvm::FPPassManager ::doFinalization#(anonymous namespace)::MPPassManager::runOnModule#(anonymous namespace)::EmitAssemblyHelper::RunCodegenPipeline#(anonymous namespace)::EmitAssemblyHelper::EmitAssembly#clang::EmitBackendOutput#clang::ParseAST#clang:: ASTFrontendAction::ExecuteAction#clang::CodeGenAction::ExecuteAction#clang::FrontendAction::Execute#clang::CompilerInstance::ExecuteAction#cc1_main#ExecuteCC1Tool#llvm::CrashRecoveryContext::RunSafely#clang::driver::CC1Command:: Execute#clang::driver::Compilation::ExecuteCommand#clang::driver::Compilation::ExecuteJobs#clang::driver::Driver::ExecuteCompilation']

4 Drawing