Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 5 Sep 2012 16:28:13 +0100
From:      Jonathan Anderson <jonathan@FreeBSD.org>
To:        freebsd-arch@freebsd.org
Subject:   Call graphs with bsd.obj.mk
Message-ID:  <CAMGEAwCNuF-P80XgsMBm1a=vSPBhB_GNw%2Bqw5ZUmPXRC2NrsGQ@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
--e89a8fb1ffc2e8f05c04c8f605cf
Content-Type: text/plain; charset=UTF-8

Hi all,

While doing some hacking recently, I really wanted a call graph. Clang
and LLVM make this pretty easy, assuming you have the right CFLAGS, so
a little build system integration seemed to be in order. I did this,
it's pretty small and modular, and I find it useful, so I'm sharing
this work with the list in the hope of putting it into -CURRENT.

I've attached two BSD makefiles that let me produce call graphs from
any directory that includes bsd.obj.mk (which notably includes
binaries and libraries in src):

 - bsd.analysis.mk contains a 'callgraph' target that produces
${.OBJDIR}/_callgraph_.dot
 - bsd.llvm.mk contains a few LLVM helpers (e.g. to generate LLVM IR)

If you have clang, llvm-link and opt installed, this allows you to
generate a complete call graph for C code; assembler files are ignored
because we don't currently have assembly -> IR transformations. The
resulting graph can be pretty large and ugly (e.g. LLVM shows an
"external node" pseudo-function that calls everything), but it can be
filtered with scripts like those found at
https://github.com/trombonehero/dot-tools to produce really useful
graphs.

llvm-link and opt aren't included in the bootstrap tools, so I'm
currently doing this by installing the llvm-devel package. Perhaps we
might copy llvm-link and opt over to /usr/obj/usr/src/tmp, possibly
governed by a WITH_LLVM_TOOLS flag in src.conf or something?


Jon
-- 
Jonathan Anderson

jonathan@FreeBSD.org
http://freebsd.org/~jonathan/

--e89a8fb1ffc2e8f05c04c8f605cf
Content-Type: application/octet-stream; name="bsd.analysis.mk"
Content-Disposition: attachment; filename="bsd.analysis.mk"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_h6qkstw70

IyAkRnJlZUJTRCQKIwojIFRoZSBpbmNsdWRlIGZpbGUgPGJzZC5hbmFseXNpcy5taz4gcHJvdmlk
ZXMgc291cmNlIGNvZGUgYW5hbHlzaXMgdG9vbHMgbGlrZQojIEMgY2FsbCBncmFwaHMuCiMKIyAr
KysgdGFyZ2V0cyArKysKIwojCWNhbGxncmFwaDoKIwkJR2VuZXJhdGUgYSBHcmFwaFZpeiAuZG90
IGZpbGUgaW4gJHsuT0JKRElSfS9fY2FsbGdyYXBoXy5kb3QgY29udGFpbmluZwojCQl0aGUgY2Fs
bCBncmFwaCBvZiBhbGwgQyAoYW5kIG1heWJlIEMrKykgZnVuY3Rpb25zLgojCiMJCVRoZSByZXN1
bHRpbmcgZ3JhcGggbWF5IGJlIHF1aXRlIGxhcmdlLCBzbyB5b3UgbWF5IGxpa2UgdG8gZmlsdGVy
IGl0CiMJCXVzaW5nIHNjcmlwdHMgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vdHJvbWJvbmVoZXJv
L2RvdC10b29scy4KIwoKLmluY2x1ZGUgPGJzZC5pbml0Lm1rPgouaW5jbHVkZSA8YnNkLmxsdm0u
bWs+CgouU1VGRklYRVM6IC5kb3QKCkRPVEZJTEVTPSAgJHtMTFZNX0JDOlI6Uy8kLy5kb3QvZ30K
Q0xFQU5GSUxFUys9ICR7RE9URklMRVN9IF9jYWxsZ3JhcGhfLmRvdCBfY2FsbGdyYXBoXy5iYwoK
Y2FsbGdyYXBoOiBfY2FsbGdyYXBoXy5kb3QKCl9jYWxsZ3JhcGhfLmJjOiAke0xMVk1fQkN9Cgls
bHZtLWxpbmsgLW8gJEAgJD8KCiMgRXh0cmFjdCBjYWxsIGdyYXBoIGZyb20gTExWTSBJUiAoYmlu
YXJ5IC5iYyBvciB0ZXh0dWFsIC5sbCkuCi5iYy5kb3Q6CglvcHQgLWFuYWx5emUgLWRvdC1jYWxs
Z3JhcGggJDwKCW12IGNhbGxncmFwaC5kb3QgJEAgICAgICMgTExWTSBjdXJyZW50bHkgaGFyZGNv
ZGVzIHRoZSAuZG90IG91dHB1dCBmaWxlCgoubGwuZG90OgoJb3B0IC1hbmFseXplIC1kb3QtY2Fs
bGdyYXBoICQ8CgltdiBjYWxsZ3JhcGguZG90ICRAICAgICAjIExMVk0gY3VycmVudGx5IGhhcmRj
b2RlcyB0aGUgLmRvdCBvdXRwdXQgZmlsZQoK
--e89a8fb1ffc2e8f05c04c8f605cf
Content-Type: application/octet-stream; name="bsd.llvm.mk"
Content-Disposition: attachment; filename="bsd.llvm.mk"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_h6qkstw91

IyAkRnJlZUJTRCQKIwojIFRoZSBpbmNsdWRlIGZpbGUgPGJzZC5sbHZtLm1rPiBoYW5kbGVzIExM
Vk0tc3BlY2lmaWMgdGFza3MgbGlrZSBjb21waWxpbmcKIyBDIHRvIExMVk0gSVIuCiMKIyArKysg
dGFyZ2V0cyArKysKIwojCWJjOgojCQljb21waWxlIGFsbCBDIHNvdXJjZXMgaW4gJHtTUkNTfSB0
byBiaW5hcnkgTExWTSBJUiBmb3JtYXQKIwojCWlyOgojCQljb21waWxlIGFsbCBDIHNvdXJjZXMg
aW4gJHtTUkNTfSB0byB0ZXh0dWFsIExMVk0gSVIgZm9ybWF0CiMKCi5pbmNsdWRlIDxic2QuaW5p
dC5taz4KCi5TVUZGSVhFUzogLmMgLmNjIC5jcHAgLmN4eCAuQyAuYmMgLmxsCgojIExMVk0gYnl0
ZWNvZGUgaXMgYSBiaW5hcnkgZm9ybWF0LgpMTFZNX0JDPSAgICAgJHtTUkNTOk4qLmg6TiouUzpS
OlMvJC8uYmMvZ30KCiMgTExWTSBJUiBjb250YWlucyB0aGUgc2FtZSBpbmZvcm1hdGlvbiwgYnV0
IGluIGFuIGFzc2VtYmx5LWxpa2UgZm9ybWF0LgpMTFZNX0lSPSAgICAgJHtTUkNTOk4qLmg6Tiou
UzpSOlMvJC8ubGwvZ30KCkNMRUFORklMRVMrPSAke0xMVk1fQkN9ICR7TExWTV9JUn0KCiMgQnVp
bGQgYWxsIExMVk0gSVIgKGJpbmFyeSAuYmMgb3IgdGV4dHVhbCAubGwpLgpiYzogJHtMTFZNX0JD
fQppcjogJHtMTFZNX0lSfQoKIyBDb21waWxlIEMgY29kZSB0byBiaW5hcnkgTExWTSBJUiBieXRl
Y29kZS4KLmMuYmM6IHVzaW5nY2xhbmcKLmlmIGRlZmluZWQoUFJPR19DWFgpCgljbGFuZysrIC1j
IC1lbWl0LWxsdm0gJHtDRkxBR1N9IC1vICRAICQ8Ci5lbHNlCgljbGFuZyAtYyAtZW1pdC1sbHZt
ICR7Q0ZMQUdTfSAtbyAkQCAkPAouZW5kaWYKCiMgQ29tcGlsZSBDIGNvZGUgdG8gdGV4dHVhbCBM
TFZNIElSIGZvcm1hdC4KLmMubGw6IHVzaW5nY2xhbmcKLmlmIGRlZmluZWQoUFJPR19DWFgpCglj
bGFuZysrIC1TIC1lbWl0LWxsdm0gJHtDRkxBR1N9IC1vICRAICQ8Ci5lbHNlCgljbGFuZyAtUyAt
ZW1pdC1sbHZtICR7Q0ZMQUdTfSAtbyAkQCAkPAouZW5kaWYKCiMgRW5zdXJlIHRoYXQgd2UgYXJl
IGNvbXBpbGluZyB3aXRoIGNsYW5nLgp1c2luZ2NsYW5nOgouaWYgJHtNS19DTEFOR30gIT0gInll
cyIKCUBlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PSIKCUBlY2hvICJDIC0+IExMVk0gSVIgY29tcGlsYXRpb24g
cmVxdWlyZXMgY2xhbmcuIgoJQGVjaG8gIllvdSBtYXkgd2lzaCB0byBlbmFibGUgV0lUSF9DTEFO
RyBpbiAvZXRjL21ha2UuY29uZi4iCglAZWNobyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCglAZXhpdCAxCi5lbmRp
ZgoK
--e89a8fb1ffc2e8f05c04c8f605cf--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAMGEAwCNuF-P80XgsMBm1a=vSPBhB_GNw%2Bqw5ZUmPXRC2NrsGQ>