DragonEgg示例分析

Posted 吴建明

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DragonEgg示例分析相关的知识,希望对你有一定的参考价值。

DragonEgg示例分析

以下是使用gcc-4.5编译一个简单的“hello-world”程序的结果:

$ gcc hello.c -S -O1 -o -

       .file  "hello.c"

       .section  .rodata.str1.1,"aMS",@progbits,1

.LC0:

       .string     "Hello world!"

       .text

.globl main

       .type       main, @function

main:

       subq       $8, %rsp

       movl       $.LC0, %edi

       call  puts

       movl       $0, %eax

       addq      $8, %rsp

       ret

       .size main, .-main

       .ident     "GCC: (GNU) 4.5.0 20090928 (experimental)"

       .section  .note.GNU-stack,"",@progbits

在gcc命令行中添加-fplugin=path/dragonegg.so会导致程序被LLVM优化和编码:

$ gcc hello.c -S -O1 -o - -fplugin=./dragonegg.so

        .file          "hello.c"

# Start of file scope inline assembly

        .ident       "GCC: (GNU) 4.5.0 20090928 (experimental) LLVM: 82450:82981"

# End of file scope inline assembly

        .text

        .align       16

        .globl       main

        .type        main,@function

main:

        subq        $8, %rsp

        movl        $.L.str, %edi

        call          puts

        xorl          %eax, %eax

        addq        $8, %rsp

        ret

        .size         main, .-main

        .type        .L.str,@object

        .section    .rodata.str1.1,"aMS",@progbits,1

.L.str:

        .asciz       "Hello world!"

        .size         .L.str, 13

        .section    .note.GNU-stack,"",@progbits

添加-fplugin arg dragonegg emit ir或-flto会导致输出LLVM ir(需要请求汇编程序输出-S,而不是对象代码输出-c,因为否则gcc会将LLVM ir传递给系统汇编程序,而系统汇编程序无疑无法对其进行汇编):

$ gcc hello.c -S -O1 -o - -fplugin=./dragonegg.so -fplugin-arg-dragonegg-emit-ir

; ModuleID = \'hello.c\'

target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"

target triple = "x86_64-unknown-linux-gnu"

module asm "\\09.ident\\09\\22GCC: (GNU) 4.5.0 20090928 (experimental) LLVM: 82450:82981\\22"

@.str = private constant [13 x i8] c"Hello world!\\00", align 1 ; <[13 x i8]*> [#uses=1]

define i32 @main() nounwind

entry:

  %0 = tail call i32 @puts(i8* getelementptr inbounds ([13 x i8]* @.str, i64 0, i64 0)) nounwind ; <i32> [#uses=0]

  ret i32 0

declare i32 @puts(i8* nocapture) nounwind

获取DragonEgg-3.3源代码:

wget http://llvm.org/releases/3.3/dragonegg-3.3.src.tar.gz

打开包装:

tar xzf dragonegg--3.3.src.tar.gz

安装LLVM的3.3版,例如下载并安装适用于现有平台的LLVM-3.3二进制文件(称为clang二进制文件)。

确保安装了gcc-4.5、gcc-4.6、gcc-4.7或gcc-4.8(不需要构建自己的副本);gcc-4.6效果最好。在Debian和Ubuntu上,需要安装相应的插件开发包(gcc-4.5-plugin-dev、gcc-4.6-plugin-dev等)。

执行

       GCC=gcc-4.6 make

(如果使用gcc-4.6;否则用目前现存的gcc版本替换gcc-4.6)在dragonegg--3.3.src目录中应该构建dragonegg.so。如果LLVM二进制文件不在目前路径中,那么可以使用

GCC=gcc-4.6 LLVM_CONFIG=directory_where_llvm_installed/bin/llvm-config make

如果只构建了LLVM而没有安装它,那么仍然可以通过将LLVM_CONFIG设置为指向构建树中LLVM配置的副本来构建dragonegg。

要使用dragonegg.so,请使用gcc-4.6或使用的任何版本的gcc编译一些内容,在命令行中添加-fplugin=path_To_dragonegg/dragoneggso。

获取开发版本

获取DragonEgg开发版本的源代码:

svn http://llvm.org/svn/llvm-project/dragonegg/trunk

获取LLVM开发版本的源代码:

svn http://llvm.org/svn/llvm-project/llvm/trunkllvm

以通常的方式构建LLVM。

安装gcc-4.5、gcc-4.6、gcc-4.7或gcc-4.8(不需要构建自己的副本)。在Debian和Ubuntu上,需要安装相应的插件开发包(gcc-4.5-plugin-dev、gcc-4.6-plugin-dev等)。

执行

       GCC=place_you_installed_gcc/bin/gcc make

然后,在dragonegg目录中构建dragonegg.so。

要使用dragonegg.so,请使用刚安装的gcc版本编译一些组件,在命令行中添加-fplugin=path_to_dragonegg/dragonegg.so。

R语言构建生存分析(survival analysis)模型示例

R语言构建生存分析(survival analysis)模型示例

生存分析处理的是预测特定事件将要发生的时间。它也被称为失败时间分析或死亡时间分析。例如,预测癌症患者存活的天数,或者预测机械系统将要失效的时间。

使用名为Survive的R包进行生存分析。这个包包含函数Surv(),它将输入数据作为R公式,并在选定的变量中创建一个生存对象进行分析。然后我们使用函数survfit()为分析创建一个图。

#安装包

install.packages("survival")

生存分析的语法结构核心:

Surv(time,event)
survfit(formula)

时间(time)是事件发生经历的时间。

事件(event)指示预期事件的发生状态。

公式(formula)

以上是关于DragonEgg示例分析的主要内容,如果未能解决你的问题,请参考以下文章

Wait示例分析

自定义View系列教程05--示例分析

R语言构建生存分析(survival analysis)模型示例

通过 NoClassDefFoundError 示例分析堆栈跟踪的提示

动态分析小示例| 08CMS SQL 注入分析

Async TCP Server 代码示例分析