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>