Skip to content
This repository was archived by the owner on Sep 27, 2019. It is now read-only.

Commit 31e6b49

Browse files
committed
Enable storing member fields
1 parent b63b0af commit 31e6b49

File tree

3 files changed

+59
-15
lines changed

3 files changed

+59
-15
lines changed

src/codegen/codegen.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
//
77
// Identification: src/codegen/codegen.cpp
88
//
9-
// Copyright (c) 2015-2017, Carnegie Mellon University Database Group
9+
// Copyright (c) 2015-2018, Carnegie Mellon University Database Group
1010
//
1111
//===----------------------------------------------------------------------===//
1212

@@ -294,16 +294,26 @@ uint64_t CodeGen::ElementOffset(llvm::Type *type, uint32_t element_idx) const {
294294

295295
////////////////////////////////////////////////////////////////////////////////
296296
///
297-
/// CPP Proxy Compiled Member
297+
/// Proxy Member
298298
///
299299
////////////////////////////////////////////////////////////////////////////////
300300

301-
llvm::Value *CppProxyMember::Load(CodeGen &codegen, llvm::Value *ptr) const {
301+
llvm::Value *CppProxyMember::Load(CodeGen &codegen,
302+
llvm::Value *obj_ptr) const {
302303
llvm::SmallVector<llvm::Value *, 2> indexes = {codegen.Const32(0),
303-
codegen.Const32(slot)};
304-
llvm::Value *addr = codegen->CreateInBoundsGEP(ptr, indexes);
304+
codegen.Const32(slot_)};
305+
// TODO(pmenon): Use CreateStructGEP()
306+
llvm::Value *addr = codegen->CreateInBoundsGEP(obj_ptr, indexes);
305307
return codegen->CreateLoad(addr);
306308
}
307309

310+
void CppProxyMember::Store(CodeGen &codegen, llvm::Value *obj_ptr,
311+
llvm::Value *val) const {
312+
llvm::SmallVector<llvm::Value *, 2> indexes = {codegen.Const32(0),
313+
codegen.Const32(slot_)};
314+
llvm::Value *addr = codegen->CreateInBoundsGEP(obj_ptr, indexes);
315+
codegen->CreateStore(val, addr);
316+
}
317+
308318
} // namespace codegen
309319
} // namespace peloton

src/include/codegen/codegen.h

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
//
77
// Identification: src/include/codegen/codegen.h
88
//
9-
// Copyright (c) 2015-2017, Carnegie Mellon University Database Group
9+
// Copyright (c) 2015-2018, Carnegie Mellon University Database Group
1010
//
1111
//===----------------------------------------------------------------------===//
1212

@@ -20,16 +20,42 @@
2020
namespace peloton {
2121
namespace codegen {
2222

23-
/// A proxy to a member of a class. Users must provide both the physical
24-
/// position of the member in the class, and the C++ type of the member.
23+
// Forward declare
2524
class CodeGen;
2625

27-
struct CppProxyMember {
28-
uint32_t slot;
29-
30-
explicit CppProxyMember(uint32_t _slot) noexcept : slot(_slot) {}
26+
/**
27+
* A CppProxyMember defines an access proxy to a member defined in a C++ class.
28+
* Users can use this class to generate code to load values from and store
29+
* values into member variables of C++ classes/structs available at runtime.
30+
* Each member is defined by a slot position in the C++ struct. Slots are
31+
* zero-based ordinal numbers assigned to fields increasing order of appearance
32+
* in the struct/class.
33+
*/
34+
class CppProxyMember {
35+
public:
36+
explicit CppProxyMember(uint32_t slot) noexcept : slot_(slot) {}
37+
38+
/**
39+
* Load this member field from the provided struct pointer.
40+
*
41+
* @param codegen The codegen instance
42+
* @param obj_ptr A pointer to a runtime C++ struct
43+
* @return The value of the field
44+
*/
45+
llvm::Value *Load(CodeGen &codegen, llvm::Value *obj_ptr) const;
46+
47+
/**
48+
* Store the provided value into this member field of the provided struct.
49+
*
50+
* @param codegen The codegen instance
51+
* @param obj_ptr A pointer to a runtime C++ struct
52+
* @param val The value of the field
53+
*/
54+
void Store(CodeGen &codegen, llvm::Value *obj_ptr, llvm::Value *val) const;
3155

32-
llvm::Value *Load(CodeGen &codegen, llvm::Value *ptr) const;
56+
private:
57+
// The slot position
58+
uint32_t slot_;
3359
};
3460

3561
//===----------------------------------------------------------------------===//
@@ -90,8 +116,13 @@ class CodeGen {
90116
}
91117

92118
template <typename T>
93-
llvm::Value *Load(const T &loader, llvm::Value *ptr) {
94-
return loader.Load(*this, ptr);
119+
llvm::Value *Load(const T &loader, llvm::Value *obj_ptr) {
120+
return loader.Load(*this, obj_ptr);
121+
}
122+
123+
template <typename T>
124+
void Store(const T &storer, llvm::Value *obj_ptr, llvm::Value *val) {
125+
storer.Store(*this, obj_ptr, val);
95126
}
96127

97128
//===--------------------------------------------------------------------===//

src/include/threadpool/worker_pool.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@
1212

1313
#pragma once
1414

15+
#include <atomic>
1516
#include <functional>
17+
#include <string>
18+
#include <thread>
1619
#include <vector>
1720

1821
#include "common/container/lock_free_queue.h"

0 commit comments

Comments
 (0)