HelloGCC 2013技术讨论会录像

题 目:在Cling上实现空指针解引用检测机制
演讲者:丁保增
中科院软件所博士在读,研究方向:系统安全,虚拟化安全。在GSoC2013项目中,实现了在Cling中动态地检测空指针解引用错误。
简 介:Cling是欧洲核子研究中心(CERN)开发的C++交互式编译器。在报告中将介绍:C++交互式编译器Cling的应用场景,实现以及如何在Cling中实现动态地检测空指针解引用错误。

题 目:Build An Optimized C Runtime for Embedded Linux
演讲者:黃敬群
慣用網路暱稱是 “jserv”,長期投入開源軟件開發工作,並致力於軟硬件系統整合,同時擔任台灣聯發科技和工業技術研究院等單位的顧問,協助銜接開放系統的豐富資源和活躍的社區。近期除了投入於醫療電子產業之外,也在台灣的大學院校授課,與學生一同探討嵌入式系統和操作系統一類的議題。
http://about.me/jserv
简 介:olibc is derived from bionic libc used in Android, which was initially derived from NetBSD libc. olibc is expected to merge the enhancements done by several SoC vendors and partners, such as Qualcomm, TI, Linaro, etc., which is known to be the major difference from glibc, uclibc, and other traditional C library implementations. Typically, the code size of olibc runtime should be highly customizable. For ARM target, olibc would benefit from ARMv7 specific features like NEON, Thumb-2, VFPv3/VFPv4, and latest compiler optimization techniques. Also, olibc is released under BSD License.

题 目:GCC上归纳变量的优化
演讲者:程斌
ARM工程师,开源工具链爱好者, GCC、Newlib开发者,目前在ARM从事GNU工具链开发方面的工作。
简 介:归纳变量是循环优化中非常重要的因素。不同的IV选取方法往往导致生成代码的大小和性能有很大的差距。ARM工程师程斌在GCC的IV Optimization上做了很多的调优和修复,并在目标机上取得了明显的性能提升。他将会介绍IVO的概况和他遇到的一些有趣的问题。

题 目:Port GCC to a new architecture – Case study: nds32
演讲者:Chung-Ju Wu
Chung-Ju Wu is a compiler engineer at Andes Technology Corporation. He is currently working with other engineers on developing a complete toolchain/compiler for supporting Andes nds32 architecture.
He received M.S. degree in Computer Science from National Tsing-Hua University,
HsinChu, where he is also working towards the Ph.D degree. His research interests include GCC/Open64 compiler porting, compiler optimizations, and system software for embedded SoC integrations.
简 介:GCC, GNU Compiler Collection, has been ported to a wide variety of processor architectures. Although there are some documentation describing GCC internal infrastructures and porting mechanism, there is still gap between modifying existing ports and adding new ports in GCC.
In this session, an architecture — nds32 — is taken as case study, we will go through necessary steps of creating a new target port for GCC from scratch. This presentation starts with introducing the source files that are required to be modified and prepared. Then some fundamental naming patterns in machine description will be mentioned. We will also talk about how to improve code generation by utilizing target hooks and refine machine description patterns. Hopefully this tutorial is able to provide some guidelines for ones who are interested in porting GCC for a new architecture.

题 目:The Theory, History and Future of System Linkers
演讲者:Luba Tang
Taiwan Evolution Software Technology, Founder. Luba Tang received his M.S. degree in computer science from the National Tsing-Hua University, Taiwan. He has been a Ph.D. student in computer science department of National Tsing-Hua University, Taiwan since 2007. At the same time, he has been working in the compiler groups at Marvell, Inc. and MediaTek, Inc. since 2010. His research interests include both electronic system level (ESL) design and compilers. He had focused on iterative compiler, ahead-of-time compiler, and link-time optimization. His most recent work focus is on cloud compilation. He was the chief programmer of Starfish DSP simulator, the original author of Marvell iterative compiler, and also the software architect of MCLinker. His most recent position is the founder of Taiwan Evolution Software Technology Inc..
简 介:The tedious and tough details of linking process limit the development of system linkers for more than 30 years. Most works stopped at providing portable infrastructures; Some works ever focused on optimizing linker, but all of them become limited binary rewriter, not real and practical linkers; Only few works ever addressed on modeling linking process.
In this presentation, I will review the history of development of system linkers. I will start from introduction to 1992 OM system – the first work attempts to build an optimizing linker. I will also introduce several famous successors – ATOM and Intel PIN projects, some competitors – 1999 Alto, 2000 ICFG and 2003 Diablo link-time optimizer and eventually introduce modern optimizing linkers – Google gold, Apple ld64 and MCLinker.
Modern optimizing linkers have different models of linking. Every models have its unique strength and weakness. I will introduce the differences, advantages and drawbacks of these linkers. This part will touch ATOM model of ld64 and Fragment-reference model of MCLinker.
Finally, I will introduce a new open source project – bold. The goal of the bold project is to provide a parallel and optimizing linking infrastructure. It’s my introspection of linking models.

题 目:The implementation of AArch64 Neon™ in LLVM
演讲者:刘江宁
现任ARM首席软件工程师(Principal software engineer), 长期从事编译器软件的设计和开发工作。从2000年至2010年任职于英特尔,期间曾在英特尔编译器实验室参与和领导开发多个编译器项目,其中包括UEFI中间代码编译器,英特尔编译器x86-64后端实现,以及动态二进制代码翻译性能优化等等。自2011年起任职ARM软件工具链部门,参与和领带开源软件的开发工作,其中包括针对ARM Cortex-M系列CPU的GCC编译器的性能优化,以及LLVM/Clang编译器针对ARM v7/v8 CPU的实现。
简 介:开发一个LLVM的新后端时,刚开始的时候是往往是比较简单直接的。但是越往后越就会发现要做好一个LLVM后端有很多要考虑的问题。ARM工程师刘江宁在LLVM后段开发时遇到一些问题。他将描述这些问题并分享解决这些问题的经验。

更多HelloGCC 2013相关信息请访问这里

Clang文档翻译—- Using Clang Tools—-Overview

原文地址:http://clang.llvm.org/docs/ClangTools.html

译者:shining

简介

 

Clang工具是为C++开发者所设计的单独的命令行(潜在的图形界面)工具,这些开发者是已经使用Clang并且喜欢使用Clang作为他们的编译器。这些工具提供了面向开发的功能:语法检查,自动格式化,重构等。

只有少数几个最基本和基础的工具被保留在Clang的SVN工程里。剩下的工具都被保存在边上其他的工程里,因为有些用户不想要或者不需要构建他 们。如果你想进入额外的Clang工具代码库,简单的把他们下载到你的Clang的工具目录,然后采用平常所使用的构建过程去和有关联的 LLVM/Clang代码一起构建:

  • With Subversion:
    • cd llvm/tools/clang/tools
    • svn cohttp://llvm.org/svn/llvm-project/clang-tools-extra/trunk extra
  • Or with Git:
    • cd llvm/tools/clang/tools
    • git clonehttp://llvm.org/git/clang-tools-extra.gitextra

这个文档描述了工程内部的Clang工具的高层次组织的简介,同时介绍了这些工具中更重要的几个。然而,需要注意的是,这个文档只是针对Clang和Clang工具的开发者,不是这些工具的最终用户。

Clang工具的组织

Clang工具是为了让C++开发者可以直接使用的命令行或者图形界面程序。它们最初不是为了给Clang的开发者使用的,尽管希望它们可以对恰巧 工作在Clang的C++开发者有很大帮助,我们积极扩展他们的功能。它们被作为三个部分进行开发:基于Clang而构建的一个单独工具的基础设施;被很 多不同的工具所使用的核心共享逻辑,这些工具是以重构和重写库的形式出现的;工具本身。

Clang工具的基础设施是LibTooling平台。可以从它的文档中看到更多关于它的架构如何工作的细节。重构和重写的工具包风格的库的共同之处也是LibTooling组织的一部分。

几乎没有Clang工具是和核心的Clang库,像基本功能和测试用例那样一起开发。然而,大多数的工具就在边上的代码库(不在项目的代码库)上开 发就是为了证明它们其实就是简单的从核心库中分离。我们没打算支持很多不在项目代码库的公共库,我们想很细心的复审和查找好的库的接口,然后把它们从那些 库里放到核心Clang库系列。

无论Clang的工具的代码放在哪个代码库中,所有的Clang工具的开发过程和实践都是Clang本身的。它们都是Clang项目的一部分,无论使用什么样的版本控制体系。

核心Clang工具

Clang工具的核心系列是在主工程之内的,完成程度已经非常高,并且允许使用和进行Clang的特定功能测试。

clang-check

ClangCheck联合了运行一个Clang工具所需的LibTooling框架和对特定的文件进行快速的语法检查的Clang诊断,使用的是命 令行接口。它也可以通过接受不同的标志来显示不同格式的输出,适合用来驱动IDE或者编辑器。此外,它能在修复模式下直接使用Clang提供的修复提示。 可以从文档How To Setup Clang Tooling For LLVM中去查找如何去建立和使用clang-check的命令。

clang-format

Clang-format既是一个库,也是一个单独的工具,它的目标是根据认证的风格指引去自动格式化C++源码文件。为了达到这个目 标,clang-format使用Clang的Lexer去把一个输入文件转换为一个token流,然后改变这些token周围的的所有空格。 clang-format的这个目标是既要可以作为一个用户工具(理论上拥有强大的IDE集成),同时又要作为其它重构工具的一部分,比如:在重命名的时 候去格式化所有改变的行。

cpp11-migrate

cpp11-migrate 迁移C++的代码去在合适的地方使用C++11的特性。目前它可以:

  • 把循环转化为基于范围的for循环;
  • 把空指针常量(比如NULL或者0)转换为C++11的nullptr;
  • 用auto类型说明符替换变量声明中的类型说明;
  • 在适当的成员函数上添加override说明;

额外的Clang工具

不同种类的Clang工具被添加到额外的代码库中,它们将在这里被跟踪记录。这个文档的焦点是对于其他工具开发者来说的工具范围特征,每一个工具都应该提供它自己的聚焦用户的文档。

新工具的思路:

  • C++ cast转换工具。将可以把C风格的casts((type)value) 转换为C++ cast(static_cast,const_cast orreinterpret_cast)。
  • 无成员的begin()和end()转换工具。将可以转换foo.begin()为begin(foo),end()也是同样的,这里的foo是一个标准容器。我们也会探测数组的相似的模式。
  • make_shared /make_unique转换。这个转换器的一部分可以和auto转换器联合起来。它将可以转换:
    std::shared_ptr<Foo> sp(new Foo);
    std::unique_ptr<Foo> up(new Foo);
    
    func(std::shared_ptr<Foo>(new Foo), bar());

    变为:

    auto sp = std::make_shared<Foo>();
    auto up = std::make_unique<Foo>(); // In C++14 mode.
    
    // This also affects correctness.  For the cases where bar() throws,
    // make_shared() is safe and the original code may leak.
    func(std::make_shared<Foo>(), bar());
  • tr1去除工具。它将使用TR1库的源码迁移到使用C++11的库。例如:
    #include <tr1/unordered_map>
    int main()
    {
        std::tr1::unordered_map <int, int> ma;
        std::cout << ma.size () << std::endl;
        return 0;
    }

    应该被重写为:

    #include <unordered_map>
    int main()
    {
        std::unordered_map <int, int> ma;
        std::cout << ma.size () << std::endl;
        return 0;
    }
  • 一个去除auto工具。将把auto转换为一个明确的类型或者添加推断的类型到注释里。这个工具的动机是因为有开发者不想去使用auto,他们害怕会让他们的代码失控。
  • C++14:更少的函数对象冗余操作(N3421)。例如:
    sort(v.begin(), v.end(), greater<ValueType>());

    应该被重写为:

    sort(v.begin(), v.end(), greater<>());