Clang

2012-01-20 30 views
5
ile dinamik enstrümantasyon

Clang kullanarak bir kaynak dosya alıp enstrümentasyon çıktısı ürettiğim C (ve belki C++) ile bir takım dinamik kod enstrümantasyonu yaparak Clang kullanmanın hızını artırmaya çalışıyorum. Herhangi bir bloğun başlangıcında bir işlev çağrısı eklemek ve aynı zamanda bazı işlevleri çağırmak için tüm boole ifadelerini de değiştirmek istiyorum. Örneğin:Clang

foo = a && (b || c); 

gibi bir şey olacaktı:

foo = EXPR_AND(a, EXPR_OR(b, c)); 

ve böylece ben meydana koşulların tüm kombinasyonları izleyebilir.

Bir RecursiveASTVisitor kullanarak en iyi yaklaşım olacağını varsayalım, ama ziyaret ettiğim her düğüm için C kodunu çıkarmanın kolay bir yolu var mıdır?

Böyle bir şeyi başarmak için nelere bakmanız gerektiğine dair herhangi bir öneri en çok takdir edilecektir!

Not: Bazı araştırmalardan sonra, en iyi arkadaşım olabileceğine benzeyen libclang'ı keşfettim. Yeniden yazıcının yanında, ihtiyacım olan şeyi alabilirim. İyi örneklere yönelik işaretçiler (Az önce Apple geliştiricilerinin libclang'da videoyla tanışmasını buldum) harika olurdu.

+0

Sizin b' 'eğer kod semantiğini değiştiren büyük ölçüde dönüştürmek veya' herhangi bir yan etkisi ihtiva C' önerdi ... Aslında EXPR_AND ve EXPR_OR şuna benzer makro açılımları olan –

+0

: #define EXPR_AND (a, b) (a? instr [0] = 1: instr [1] = 1,0) && (b? instr [2] = 0: instr [3] = 1,0) –

cevap

2

İyi bir örnek için bkz. this project.

Arayanın girme işlevinin girilmesi ve çıkması için clang kullanır ve ayrıca aktarılan argüman türlerini de denetler.