blob: a37177c5d1db7ff56db6f567bd0f8b0036bff76a [file] [log] [blame]
Lang Hames5f7fcef2015-10-29 03:53:42 +00001//===-- ObjectLinkingLayerTest.cpp - Unit tests for object linking layer --===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "llvm/ExecutionEngine/ExecutionEngine.h"
11#include "llvm/ExecutionEngine/SectionMemoryManager.h"
12#include "llvm/ExecutionEngine/Orc/CompileUtils.h"
13#include "llvm/ExecutionEngine/Orc/LambdaResolver.h"
14#include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"
15#include "llvm/IR/Constants.h"
16#include "llvm/IR/LLVMContext.h"
17#include "gtest/gtest.h"
18
19using namespace llvm;
20using namespace llvm::orc;
21
22namespace {
23
24TEST(ObjectLinkingLayerTest, TestSetProcessAllSections) {
25
26 class SectionMemoryManagerWrapper : public SectionMemoryManager {
27 public:
28 SectionMemoryManagerWrapper(bool &DebugSeen) : DebugSeen(DebugSeen) {}
29 uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment,
30 unsigned SectionID,
31 StringRef SectionName,
32 bool IsReadOnly) override {
33 if (SectionName == ".debug_str")
34 DebugSeen = true;
35 return SectionMemoryManager::allocateDataSection(Size, Alignment,
36 SectionID,
37 SectionName,
38 IsReadOnly);
39 }
40 private:
41 bool DebugSeen;
42 };
43
44 ObjectLinkingLayer<> ObjLayer;
45
46 auto M = llvm::make_unique<Module>("", getGlobalContext());
47 M->setTargetTriple("x86_64-unknown-linux-gnu");
48 Type *Int32Ty = IntegerType::get(getGlobalContext(), 32);
49 GlobalVariable *GV =
50 new GlobalVariable(*M, Int32Ty, false, GlobalValue::ExternalLinkage,
51 ConstantInt::get(Int32Ty, 42), "foo");
52
53 GV->setSection(".debug_str");
54
55 std::unique_ptr<TargetMachine> TM(
56 EngineBuilder().selectTarget(Triple(M->getTargetTriple()), "", "",
57 SmallVector<std::string, 1>()));
58 if (!TM)
59 return;
60
61 auto OwningObj = SimpleCompiler(*TM)(*M);
62 std::vector<object::ObjectFile*> Objs;
63 Objs.push_back(OwningObj.getBinary());
64
65 bool DebugSectionSeen = false;
66 SectionMemoryManagerWrapper SMMW(DebugSectionSeen);
67 auto Resolver =
68 createLambdaResolver(
69 [](const std::string &Name) {
70 return RuntimeDyld::SymbolInfo(nullptr);
71 },
72 [](const std::string &Name) {
73 return RuntimeDyld::SymbolInfo(nullptr);
74 });
75
76 {
77 // Test with ProcessAllSections = false (the default).
78 auto H = ObjLayer.addObjectSet(Objs, &SMMW, &*Resolver);
79 EXPECT_EQ(DebugSectionSeen, false)
80 << "Unexpected debug info section";
81 ObjLayer.removeObjectSet(H);
82 }
83
84 {
85 // Test with ProcessAllSections = true.
86 ObjLayer.setProcessAllSections(true);
87 auto H = ObjLayer.addObjectSet(Objs, &SMMW, &*Resolver);
88 EXPECT_EQ(DebugSectionSeen, true)
89 << "Expected debug info section not seen";
90 ObjLayer.removeObjectSet(H);
91 }
92}
93
94}