record llvm cgu instruction stats
This commit is contained in:
parent
07c993eba8
commit
a30de6e7cb
6 changed files with 41 additions and 0 deletions
|
@ -3801,6 +3801,8 @@ dependencies = [
|
||||||
"rustc_span",
|
"rustc_span",
|
||||||
"rustc_symbol_mangling",
|
"rustc_symbol_mangling",
|
||||||
"rustc_target",
|
"rustc_target",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
"smallvec",
|
"smallvec",
|
||||||
"tempfile",
|
"tempfile",
|
||||||
"tracing",
|
"tracing",
|
||||||
|
|
|
@ -36,3 +36,5 @@ smallvec = { version = "1.8.1", features = ["union", "may_dangle"] }
|
||||||
rustc_ast = { path = "../rustc_ast" }
|
rustc_ast = { path = "../rustc_ast" }
|
||||||
rustc_span = { path = "../rustc_span" }
|
rustc_span = { path = "../rustc_span" }
|
||||||
tempfile = "3.2.0"
|
tempfile = "3.2.0"
|
||||||
|
serde = { version = "1", features = [ "derive" ]}
|
||||||
|
serde_json = "1"
|
||||||
|
|
|
@ -761,6 +761,7 @@ pub(crate) unsafe fn codegen(
|
||||||
EmitObj::None => {}
|
EmitObj::None => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
record_llvm_cgu_instructions_stats(&cgcx.prof, llmod);
|
||||||
drop(handlers);
|
drop(handlers);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -974,3 +975,23 @@ fn record_artifact_size(
|
||||||
self_profiler_ref.artifact_size(artifact_kind, artifact_name.to_string_lossy(), file_size);
|
self_profiler_ref.artifact_size(artifact_kind, artifact_name.to_string_lossy(), file_size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn record_llvm_cgu_instructions_stats(prof: &SelfProfilerRef, llmod: &llvm::Module) {
|
||||||
|
if !prof.enabled() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let raw_stats =
|
||||||
|
llvm::build_string(|s| unsafe { llvm::LLVMRustModuleInstructionStats(&llmod, s) })
|
||||||
|
.expect("cannot get module instruction stats");
|
||||||
|
|
||||||
|
#[derive(serde::Deserialize)]
|
||||||
|
struct InstructionsStats {
|
||||||
|
module: String,
|
||||||
|
total: u64,
|
||||||
|
}
|
||||||
|
|
||||||
|
let InstructionsStats { module, total } =
|
||||||
|
serde_json::from_str(&raw_stats).expect("cannot parse llvm cgu instructions stats");
|
||||||
|
prof.artifact_size("cgu_instructions", module, total);
|
||||||
|
}
|
||||||
|
|
|
@ -2410,6 +2410,8 @@ extern "C" {
|
||||||
pub fn LLVMRustModuleBufferLen(p: &ModuleBuffer) -> usize;
|
pub fn LLVMRustModuleBufferLen(p: &ModuleBuffer) -> usize;
|
||||||
pub fn LLVMRustModuleBufferFree(p: &'static mut ModuleBuffer);
|
pub fn LLVMRustModuleBufferFree(p: &'static mut ModuleBuffer);
|
||||||
pub fn LLVMRustModuleCost(M: &Module) -> u64;
|
pub fn LLVMRustModuleCost(M: &Module) -> u64;
|
||||||
|
#[allow(improper_ctypes)]
|
||||||
|
pub fn LLVMRustModuleInstructionStats(M: &Module, Str: &RustString);
|
||||||
|
|
||||||
pub fn LLVMRustThinLTOBufferCreate(M: &Module, is_thin: bool) -> &'static mut ThinLTOBuffer;
|
pub fn LLVMRustThinLTOBufferCreate(M: &Module, is_thin: bool) -> &'static mut ThinLTOBuffer;
|
||||||
pub fn LLVMRustThinLTOBufferFree(M: &'static mut ThinLTOBuffer);
|
pub fn LLVMRustThinLTOBufferFree(M: &'static mut ThinLTOBuffer);
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include "llvm/Support/Debug.h"
|
#include "llvm/Support/Debug.h"
|
||||||
#include "llvm/Support/DynamicLibrary.h"
|
#include "llvm/Support/DynamicLibrary.h"
|
||||||
#include "llvm/Support/FormattedStream.h"
|
#include "llvm/Support/FormattedStream.h"
|
||||||
|
#include "llvm/Support/JSON.h"
|
||||||
#include "llvm/Support/Host.h"
|
#include "llvm/Support/Host.h"
|
||||||
#include "llvm/Support/Memory.h"
|
#include "llvm/Support/Memory.h"
|
||||||
#include "llvm/Support/SourceMgr.h"
|
#include "llvm/Support/SourceMgr.h"
|
||||||
|
|
|
@ -1751,6 +1751,19 @@ LLVMRustModuleCost(LLVMModuleRef M) {
|
||||||
return std::distance(std::begin(f), std::end(f));
|
return std::distance(std::begin(f), std::end(f));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" void
|
||||||
|
LLVMRustModuleInstructionStats(LLVMModuleRef M, RustStringRef Str)
|
||||||
|
{
|
||||||
|
RawRustStringOstream OS(Str);
|
||||||
|
llvm::json::OStream JOS(OS);
|
||||||
|
auto Module = unwrap(M);
|
||||||
|
|
||||||
|
JOS.object([&] {
|
||||||
|
JOS.attribute("module", Module->getName());
|
||||||
|
JOS.attribute("total", Module->getInstructionCount());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Vector reductions:
|
// Vector reductions:
|
||||||
extern "C" LLVMValueRef
|
extern "C" LLVMValueRef
|
||||||
LLVMRustBuildVectorReduceFAdd(LLVMBuilderRef B, LLVMValueRef Acc, LLVMValueRef Src) {
|
LLVMRustBuildVectorReduceFAdd(LLVMBuilderRef B, LLVMValueRef Acc, LLVMValueRef Src) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue